Plutos-AVR

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
pluto
Lazarusforum e. V.
Beiträge: 7114
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Plutos-AVR

Beitrag von pluto »

Falls du dich für die Programmierung von Microchip uP's in Pascal interessierst, Edsons PicPas ist ein weiteres interessantes Projekt:

Ich habe es mir angesehen, die Idee sieht nicht schlecht aus, gerade der untere Teil, wo RAM und sowas angezeigt wird. Es scheint aber nicht für die atMegas gedacht zu sein oder?
Auf den ersten Blick ist es wohl nur für Pic....
MFG
Michael Springwald

pluto
Lazarusforum e. V.
Beiträge: 7114
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Plutos-AVR

Beitrag von pluto »

if (t and $8000) then

Wie sieht sowas in Pascal aus ?

result:=-int16(t and $7FFF)

Das hier wird kompiliert.
MFG
Michael Springwald

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Plutos-AVR

Beitrag von mse »

pluto hat geschrieben:
if (t and $8000) then

Wie sieht sowas in Pascal aus ?

if t and $8000 <> 0 then

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Plutos-AVR

Beitrag von mse »

pluto hat geschrieben:Auf den ersten Blick ist es wohl nur für Pic....

AFAIK für PIC6x. Das sind auch praktische uP's. Ich weiss nicht ob Edson weitere Familien zu unterstützen plant.

pluto
Lazarusforum e. V.
Beiträge: 7114
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Plutos-AVR

Beitrag von pluto »

if t and $8000 <> 0 then

Prima danke!

Code: Alles auswählen

if (t == 0xFFFF) return NAN;

Wird hier ein Speicherübrlauf geprüft? Würde das in Pascal genauso aussehen wie oben?
if t and $FFFF = 0 then ? Edit: Die frage ist auch: Was für ein Rückgabe Wert NAN gibt es nicht... und -1 geht ja auch nicht.....

AFAIK für PIC6x. Das sind auch praktische uP's. Ich weiss nicht ob Edson weitere Familien zu unterstützen plant.

Gut zu wissen, dass es noch mehr Alternativen zu Arduino gibt.

Ich finde Arduino ist einfach einfacher, aber das wird natürlich auch erkauft durch weniger Speicher und sowas.
MFG
Michael Springwald

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Plutos-AVR

Beitrag von mse »

pluto hat geschrieben:

Code: Alles auswählen

if (t == 0xFFFF) return NAN;

Wird hier ein Speicherübrlauf geprüft? Würde das in Pascal genauso aussehen wie oben?
if t and $FFFF = 0 then ? Edit: Die frage ist auch: Was für ein Rückgabe Wert NAN gibt es nicht... und -1 geht ja auch nicht.....

Ich habe nicht alles gelesen. Ich vermute, dass 0xffff einen ungültigen Wert bezeichnet. NAN = "not a number".

Code: Alles auswählen

 
if t = $ffff then begin
 <wert für "ungültig" zurückgeben>
end;
 

AFAIK für PIC6x. Das sind auch praktische uP's. Ich weiss nicht ob Edson weitere Familien zu unterstützen plant.

Gut zu wissen, dass es noch mehr Alternativen zu Arduino gibt.

Ich finde Arduino ist einfach einfacher, aber das wird natürlich auch erkauft durch weniger Speicher und sowas.

Wenn du einfache und trotzdem leistungsfähige uP's magst dann bist du mit PIC16x gut bedient. Es ist unglaublich, was man damit mit den spärlichen Ressourcen erreichen kann.
Ich habe mal für einen PIC16F73
https://www.microchip.com/wwwproducts/en/PIC16F73
eine Motorsteuerung mit komplexem Ablauf inklusive Interpreter für ein in einer speziellen Sprache geschriebenen Programm im via I2C angeschlossenen EEPROM, verschiedenen angeschlossenen Sensoren, Infrarot-Fernsteuerung, RTC, verschiedene analoge und digitale Ein- und Ausgänge, ein serielles Busprotokoll usw. gemacht. Resourcen: 4096 Befehle und 192 Bytes RAM. Die Programmierung geschah allerdings in Assembler.
Oder ein DC-Motor Controller mit Software PWM, Drehzahl- und Drehmomentregler, Ablaufsteuerung, Eingangsphasen Messung zur Parallelschaltung mit Synchronmotoren usw. Mit PIC16C54
https://www.microchip.com/wwwproducts/en/PIC16C54
512 Befehle, 25 Byte RAM.

pluto
Lazarusforum e. V.
Beiträge: 7114
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Plutos-AVR

Beitrag von pluto »

Ich habe nicht alles gelesen. Ich vermute, dass 0xffff einen ungültigen Wert bezeichnet. NAN = "not a number".

Ja, dass ist auch meine Vermutung. Problem ist halt nur, was soll ich in diesenfall zurückgeben? Normalerweise würde ich ja -1 zurück geben. Das geht aber in diesenfall natürlich nicht.

Wenn du einfache und trotzdem leistungsfähige uP's magst dann bist du mit PIC16x gut bedient. Es ist unglaublich, was man damit mit den spärlichen Ressourcen erreichen kann.

Da fällt mir der Einstieg schwer, mir fällt ja schon der Einstig bei den STM32 schwer.

eine Motorsteuerung mit komplexem Ablauf inklusive Interpreter für ein in einer speziellen Sprache geschriebenen Programm im via I2C angeschlossenen EEPROM, verschiedenen angeschlossenen Sensoren, Infrarot-Fernsteuerung, RTC, verschiedene analoge und digitale Ein- und Ausgänge, ein serielles Busprotokoll usw. gemacht. Resourcen: 4096 Befehle und 192 Bytes RAM. Die Programmierung geschah allerdings in Assembler.

Gut, wenn ich bei AVR ASM verwenden würde, wäre es wohl auch deutlich kleiner.

Im Verein haben wir eine CNC Fräse, eine Uralte, dort steckt was vergleichbares wie der atMega8 und dort wurde eine echt komplexe "GUI" geschrieben, dabei ist die Fräse schon über 20 Jahre alt.

Oder ein DC-Motor Controller mit Software PWM, Drehzahl- und Drehmomentregler, Ablaufsteuerung, Eingangsphasen Messung zur Parallelschaltung mit Synchronmotoren usw. Mit PIC16C54

Wieder mit ASM?
MFG
Michael Springwald

pluto
Lazarusforum e. V.
Beiträge: 7114
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Plutos-AVR

Beitrag von pluto »

Ja, dass ist auch meine Vermutung. Problem ist halt nur, was soll ich in diesenfall zurückgeben? Normalerweise würde ich ja -1 zurück geben. Das geht aber in diesenfall natürlich nicht.

Ich habe noch mal darüber nach gedacht und sehe aktuell nur drei Lösungen:
1. Eine Globale Fehler Variable, die Entweder true oder false ist
2. Über ein Var Parameter
3. Über ein Record der zwei Variablen enthält, einmal den Value und einmal einen Fehlercode...

Ich glaube 1. wäre am Sinnvollsten in diesen Fall, was meint ihr?

Edit1:

Code: Alles auswählen

 
function TAVR_Sensor_Am2320.readTemp(): Int16;
var
  Temp_T:Int16;
begin
  Error:=false;
  Temp_T:=readRegister16(AM2320_REG_TEMP_H);
  if Temp_T = $fff then begin
    Error:=true;
    exit;
  end;
 
  if Temp_T and $8000 <> 0 then
    result:=-int16(Temp_T and $7FFF)
  else
    result:=Temp_T;
end;
 


Der C-Code sieht so aus:

Code: Alles auswählen

 
float Adafruit_AM2320::readTemperature() {
  uint16_t t = readRegister16(AM2320_REG_TEMP_H);
  float ft;
  if (t == 0xFFFF) return NAN;
  // check sign bit - the temperature MSB is signed , bit 0-15 are magnitude
  if(t & 0x8000){
    ft = -(int16_t)(t&0x7fff);
  }
  else {
    ft = (int16_t)t;
  }
  return ft / 10.0;
}
 
MFG
Michael Springwald

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Plutos-AVR

Beitrag von mse »

pluto hat geschrieben:Wieder mit ASM?

Natürlich.
Ja, dass ist auch meine Vermutung. Problem ist halt nur, was soll ich in diesenfall zurückgeben? Normalerweise würde ich ja -1 zurück geben. Das geht aber in diesenfall natürlich nicht

Definiere für NAN einen nie vorkommenden Integerwert, z.B. $8000 = -32768.
Oder gib den Fehlerzustand als Boolean zurück:

Code: Alles auswählen

 
function TAVR_Sensor_Am2320.readTemp(out avalue: int16): boolean;
                                                     //true if ok
 

Mathias
Beiträge: 5019
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunc)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Plutos-AVR

Beitrag von Mathias »

Du hast oben im Code fff geschrieben, ich denke du willst ffff.
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot

pluto
Lazarusforum e. V.
Beiträge: 7114
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Plutos-AVR

Beitrag von pluto »

im C Code sind jedoch auch 3 FFF vorhanden?
MFG
Michael Springwald

Mathias
Beiträge: 5019
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunc)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Plutos-AVR

Beitrag von Mathias »

Ich sehe aber in der 4. Zeile 0xFFFF.
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Plutos-AVR

Beitrag von mse »

pluto hat geschrieben:im C Code sind jedoch auch 3 FFF vorhanden?

Nein, "if (t == 0xFFFF) return NAN;".

pluto
Lazarusforum e. V.
Beiträge: 7114
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Plutos-AVR

Beitrag von pluto »

Stimmt, ich habe vorhin nur den unteren Teil gesehen, danke für den Hinweis....
MFG
Michael Springwald

pluto
Lazarusforum e. V.
Beiträge: 7114
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Plutos-AVR

Beitrag von pluto »

Nun habe ich die nächste Funktion übersetzt, die ich bisher ausgelassen habe, weil ich bisher nicht verstehe was da eigentlich genau passiert:
im C++ Code wird mit Pointern gearbeitet, ich habe darauf verzichtet....

Code: Alles auswählen

 
function TAVR_Sensor_Am2320.crc16(buffer: uInt8Array; nBytes: UInt8): UInt16;
var
  crc:UInt16 = $FFFF;
  b:UInt8;
  i,x:Integer;
begin
  for i:=0 to nBytes do begin
    b:=buffer[i];
    for x:=0 to 8 do begin
 
      if crc and $0001 <> 0 then begin
        crc:=crc shr 1;
        crc:=$A001;
      end
      else
        crc:=crc shr 1;
    end; // for x
  end; // for i
 
  result:=0;
 end;
 


Der C++ Code Sieht so aus

Code: Alles auswählen

 
/**************************************************************************/
/*!
    @brief  perfor a CRC check to verify data
    @param buffer the pointer to the data to check
    @param nbytes the number of bytes to calculate the CRC over
    @return the calculated CRC
*/

/**************************************************************************/
uint16_t Adafruit_AM2320::crc16(uint8_t *buffer, uint8_t nbytes) {
  uint16_t crc = 0xffff;
  for (int i=0; i<nbytes; i++) {
    uint8_t b = buffer[i];
    crc ^= b;
    for (int x=0; x<8; x++) {
      if (crc & 0x0001) {
   crc >>= 1;
   crc ^= 0xA001;
      } else {
   crc >>= 1;
      }
    }
  }
  return crc;
}
 


Mir geht es um zwei Dinge:
1. Ich möchte gerne verstehen, was da passiert
2. Ist mein Pascal Code richtig oder habe ich was übersehen oder falsch gemacht?

Edit: finde ich sehr Praktisch: http://wiki.freepascal.org/Pascal_for_C_users/de
MFG
Michael Springwald

Antworten