Hallo Ich habe folgendes Problem: Ich habe meine ADC im m16. Den wert will ich lesen und binär am port ausgeben. Was ist an meinem code falsch? Config Porta = Input Config Portc = Output Config Adc = Single , Prescaler = Auto Start Adc Print "START CONVERTER" Dim W As Word Do W = Getadc(0) W = W / 1024 W = W * 512 Print W Portc = W Loop End W rechne ich um, dass ich auf die 8 bit komme... ist das falsch?
Christian wrote: > Hallo > > Ich habe folgendes Problem: > Ich habe meine ADC im m16. Den wert will ich lesen und binär am port > ausgeben. Was ist an meinem code falsch? Du hast nicht berücksichtigt, dass ganzzahlig gerechnet wird. Wenn W den Wert 876 hat, dann ist W / 1024 gleich 0. Und da W nur Werte von 0 bis 1023 annehmen kann, ist nach der Division durch 1024 eigentlich nur eines sicher gestellt: Das Ergebnis ist immer 0.
Christian wrote:
> geteilt durch 2 würde ja in dem fall reichen
Du willst Divisionen immer erst möglichst zum Schluss eines Rechenganges
machen! Dies deshalb, weil du in einer Division immer Bits verlierst. In
deinem Fall blöderweise alle.
W = 512 * W
W = W / 1024
Nur wird dir jetzt bei 512 * W das Ergebnis überlaufen.
Macht aber nichts. Du musst ja nicht mal 512 multiplizieren, wenn du
nachher sowieso durch 1024 dividierst.
Im Grunde rechnest du doch
512
W = W * -------
1024
und diesen Bruch kann man ja auch erst mal kürzen!
W = W / 2
macht also genau dasselbe wie deine ursprüngliche angedachte Sequenz :-)
Nachtrag: GetADC gibt einen 10 Bit Wert zurück, man kommt nicht auf 8 Bit indem man durch 2 teilt, wenn schon, dann durch 4. Aber nimm mal das Shift wie oben, das ist die natürliche Methode, da umittelbar vom µC unterstützt.
Kann man dann nicht gleich den ADC mit 8bit betreiben, ich dächte die Atmels können das.
MWS wrote: > Nachtrag: GetADC gibt einen 10 Bit Wert zurück, man kommt nicht auf 8 > Bit indem man durch 2 teilt, wenn schon, dann durch 4. Aber nimm mal das > Shift wie oben, das ist die natürliche Methode, da umittelbar vom µC > unterstützt. Einspruch: Nimm die Methode, die am Natürlichsten aus Programmierersicht erscheint. Wenn die natürlichste Methode eine Division durch 4 ist, dann schreib das auch so hin. Wenn es möglich ist, ersetzt dir jeder Compiler so eine Division durch einen Shift.
Ja das geht. In einem Register gibt es ein Bit für Left adjust... Da musst du dann explizit das H-Byte auslesen. MW
@Karl heinz, da widerspreche ich, das natürlichste aus Programmierersicht um von 10 auf 8 Bit zu kommen ist ein shift nach rechts. In realen Zahlen zu denken, ist doch hier komplizierter und unlogischer als in Bits. Außerdem stellt Bascom die Shift-Funktion für solche Zwecke bereit. @Michael, das geht, aber nicht mit dem Bascom GetADC Befehl. Da muss der Programmierer das Ergebnis der Wandlung dann selbst auslesen.
nochmal ne frage: an meinem ausgang kann ich gar nicht messen. is der controller kaputt? oder hab ich was im programm falsch? $regfile = "m16def.dat" $crystal = 1000000 $baud = 9600 $hwstack = 32 ' default use 32 for the hardware stack $swstack = 10 'default use 10 for the SW stack $framesize = 40 'default use 40 for the frame space Config Porta = Input Config Portb = Output Config Adc = Single , Prescaler = Auto Start Adc Print "START CONVERTER" Dim W As Integer Do W = Getadc(0) Select Case W Case Is >= 205 : Portb = &B00000001 Case Is >= 232 : Portb = &B00000010 Case Is >= 259 : Portb = &B00000011 Case Is >= 286 : Portb = &B00000100 Case Is >= 313 : Portb = &B00000101 Case Is >= 340 : Portb = &B00000110 Case Is >= 367 : Portb = &B00000111 Case Is >= 394 : Portb = &B00001000 Case Is >= 421 : Portb = &B00001001 Case Is >= 448 : Portb = &B00001010 Case Is >= 475 : Portb = &B00001011 Case Is >= 502 : Portb = &B00001100 Case Is >= 529 : Portb = &B00001101 Case Is >= 556 : Portb = &B00001110 Case Is >= 583 : Portb = &B00001111 Case Is >= 610 : Portb = &B00011111 Case Is >= 637 : Portb = &B00101111 Case Is >= 664 : Portb = &B00111111 Case Is >= 691 : Portb = &B01001111 Case Is >= 718 : Portb = &B01011111 Case Is >= 745 : Portb = &B01101111 Case Is >= 772 : Portb = &B01111111 Case Is >= 799 : Portb = &B10001111 Case Is >= 826 : Portb = &B10011111 Case Is >= 853 : Portb = &B10101111 Case Is >= 880 : Portb = &B10111111 Case Is >= 907 : Portb = &B11001111 Case Is >= 934 : Portb = &B11011111 Case Is >= 961 : Portb = &B11101111 Case Is >= 988 : Portb = &B11111111 End Select Print W Loop End
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.