- fchao-Sinus-Wechselrichter AliExpress         
Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 28

Thema: ADC im Free-Run Modus

  1. #1
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    31
    Beiträge
    1.578

    ADC im Free-Run Modus

    Anzeige

    Praxistest und DIY Projekte
    Hallo Leute,

    wollte mal versuchen, mit meinem ADC ein eher höher frequentes analoges Signal auszulesen, indem ich den ADC im Free-Run Modus laufen lasse und nur die höherwertigen 8 Bits auslese, allerdings funktioniert das nicht...

    Hier mal mein Code:
    Code:
    $regfile = "m32def.dat"
    $crystal = 16000000
    $framesize = 80
    $hwstack = 80
    $swstack = 80
    $baud = 19200
    
    
    Admux = &B01100000
    Adcsra = &B11000110
    
    config pina.0 = input
    porta.0 = 0
    
    dim wertl as byte
    dim werth as byte
    
    
    enable interrupts
    
    
    do
    
    wertl = adcl
    werth = adch
    print wertl
    print werth
    
    loop
    
    end
    Sowohl im Simulator, als auch in Echt funktioniert das ganze nicht
    Der eine Wert (entweder ADCH oder ADCL, weiß ich grad nicht) geht immer bis 256 und fängt dann wieder bei 0 an, das ganze 4 mal, also 4*256=1023.
    Der andere Wert zählt nur von 0 bis 3.

    Was genau mache ich den falsch? Hab die einzelnen Bits nach dem Datenblatt des Mega32 gesetzt. Aber irgendwo hab ich anscheinend einen Fehler drin?!

    Der Prescaler ist momentan auf 64, glaub ich (aber das sollte jetzt nicht so wichtig sein). Die Bits für Interrupt hab ich glaub ich beide auf 0 oder 1 gesetzt, da ich keinen Interrupt benötige.

    Wäre nett, wenn jemand mal den Code im Simulator probieren würde und mir sagen könnte, was ich falsch gemacht habe?!

    Vielen Dank, Gruß
    Chris

  2. #2
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Hallo

    Richtig flott wird es erst mit Prescaler /2 ;) Das schafft ein Mega32 mit 8MHz in Bascom:

    Bild hier  
    (Filmchen aus https://www.roboternetz.de/phpBB2/ze...=434274#434274)

    Mein Lieblingsthema...

    Ich hatte hier mal nach den Samplezeiten bei den AVRs nachgefragt:
    https://www.roboternetz.de/phpBB2/viewtopic.php?t=33070

    btw bin ich zu faul dein unkommentiertes Progrämmchen zu analysieren....

    Gruß

    mic
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  3. #3
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    34
    Beiträge
    3.501
    Blog-Einträge
    9
    Also ich habs mal im Simulator getestet. Und bei mir läuft das Programm. Es wird mir für wertl 255 ausgegeben und für werth 3 (wenn ich im Simulator den ADC auf 1023 stelle).
    Was genau meintest du jetzt, was da nicht funktionieren soll?

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.01.2006
    Beiträge
    4.555
    Das ist ja auch richtig, L byte 255 + 1 (übertrag) + H byte 3*(1+255)
    ergeben 1024. "3" im H byte bedeutet ja 3 * L byte + 1*L Byte....

    Gruß Richard

  5. #5
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    34
    Beiträge
    3.501
    Blog-Einträge
    9
    Ja deswegen versteh ich die Frage auch nicht só ganz
    Für mich macht das Programm den Eindruck als ob es ordnungsgemäß funktioniert

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.01.2006
    Beiträge
    4.555
    Zitat Zitat von Kampi
    Ja deswegen versteh ich die Frage auch nicht só ganz
    Für mich macht das Programm den Eindruck als ob es ordnungsgemäß funktioniert
    Möglich das der Poster nicht so recht weiß wie digital gezählt
    wird. Sehr oft werden ja auch H-Byte und L Byte getauscht
    gespeichert/ausgewertet dann wird das noch schwieriger zu
    überblicken....

    Speicherplatz 1= 3* 256 ( H-Byte)
    Speicherplatz 2 = 1 * 256 ( L Byte )

    Gerechnet wird aber andersherum Sp2 + ( Sp1 * 256) jetzt
    komme ich schon selber ins schleudern.

    Gruß Richard

  7. #7
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    34
    Beiträge
    3.501
    Blog-Einträge
    9
    Ja, das ist nunmal das Problem an den Berechnungen mit Bytes und Bits. Man muss da sehr genau sein sonst passieren da sehr schnell Fehler..... . Merk ich leider auch immer wieder. Beste Beispiel ist zwei Zahlen addieren, da bin ich gestern auch durcheinander gekommen mit der arethmetischen Addition (1+1 = 0 und 1 Übertrag) und der logischen Addition (also UND 1+1 = 1)

    Aber was ich jetzt nicht ganz verstehe.
    Die Zeile Adcsra = &B11000110 konfiguriert ja das Special FUnction Register des ADCs. Laut Datenblatt ist das 7. Bit für das An-und Abschalten des ADCs da.

    • Bit 7 – ADEN: ADC Enable
    Writing this bit to one enables the ADC. By writing it to zero, the ADC is turned off. Turning the
    ADC off while a conversion is in progress, will terminate this conversion.
    Aber wenn ich das Bit auf Null setze, also wenn ich schreibe:
    Adcsra = &B01000110
    und dann die Simulation starte gibt er mir trotzdem nochwas über UART aus.
    Ist das jetzt ein Simulationsfehler oder muss da noch ein Bit gesetzt werden?

  8. #8
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.01.2006
    Beiträge
    4.555
    Alter Wert, Zufallswert...? Da wird ja eher nur die/eine neue
    Wandlung gestartet/gestoppt. Denke ich jetzt mal (einfach).

    Gruß Richard

  9. #9
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    31
    Beiträge
    1.578
    hallo Leute,

    danke erstmal für die große Anzahl an Antworten!

    Also prinzipiell muss ich sagen, dass ich eig. schon weiß, wie digital gezählt wird.
    Vielleicht reden wir hier aber aneinander vorbei?!
    Wenn ich im Simulator den ADC auf 1023 stelle, kommt bei print 255(was ja richtig ist). Bei 0 im Sim kommt 0, was auch stimmt! Allerdings:
    Stellt doch im Sim den ADC mal auf 511 (nur 1 Beispiel). Dann kommt wieder 255 raus und sobald man den ADC auf 512 stellt, beginnt das ganze wieder bei 0.
    Aber das sollte doch nicht so sein, oder täusche ich mich da? Ich habe mir das so vorgestellt (und bis jetzt auch immer so aufgefasst), dass wenn ich nur die höheren 8Bit nehme, das dann das ganze einfach nur um die 2 unteren Bits (welche ich dann eben wegschneide/ignoriere) ungenauer wird, also dann der ADC nicht mehr mit 0,00488758 auflöst, sondern mit 0,01953125 Schritten.
    Demnach sollte dann der ADC-Wert von 511 nicht 255, sondern 255/2=128 entsprechen, oder hab ich da einfach nur ein grundlegendes Verständnisproblem?

    @radbruch:
    WAS soll ich den an diesem Programm noch groß kommentieren?? Es werden nur 2 Bytes deklariert und diese werden dann in einer Endlosschleife immer wieder neu mit ADCL/H überschrieben. Verstehst du das nicht?

    Gruß
    Chris

  10. #10
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    34
    Beiträge
    3.501
    Blog-Einträge
    9
    Ich glaube du hast da ein Verständnissproblem. Wenn du im Bascom einen Wert von 300 einstellst zählt das Programm das ADC L-Register bis 255 voll. Sobald dieses voll ist wird es auf 0 zurück gesetzt und das ADC H-Register wird um eins erhöht. Nun hast du einen Rest von 300-255 = 45.
    D.h. du hast den Registerinhalt von ADC L = 45 und ADC H = 1
    Wenn du jetzt ein Beispiel wie deine 511 hast dann geht das ganz glatt auf d.h. es wird bis 255 gezählt dann wird das H Register um eins erhöht dann bleibt noch ein Rest von 255 über und sobald das L Register wieder voll ist wird H auf 2 gesetzt.
    Also hast du bei einem Wert von 511 L = 0 und H = 2
    Sobald du das dann wieder umrechnest also Zahl = (L + (255 x H)) + 1 dann kommt bei:
    Zahl = (0 + (255 x 2)) +1
    Zahl = 511

Seite 1 von 3 123 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

fchao-Sinus-Wechselrichter AliExpress