Forum: Mikrocontroller und Digitale Elektronik Bascom m16 ADC Problem


von Christian (Gast)


Lesenswert?

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?

von MWS (Gast)


Lesenswert?

Und wie das falsch ist  ;-)

W = W / 1024 ergibt immer 0

von Karl H. (kbuchegg)


Lesenswert?

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.

von Christian (Gast)


Lesenswert?

ups...

klar...

sry und danke

von Christian (Gast)


Lesenswert?

wie kann ich das lösen?

das problem ist mir klar... jetzt

von Christian (Gast)


Lesenswert?

geteilt durch 2 würde ja in dem fall reichen

von Karl H. (kbuchegg)


Lesenswert?

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 :-)

von MWS (Gast)


Lesenswert?

Shift W, Right, 2

von MWS (Gast)


Lesenswert?

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.

von Peter (Gast)


Lesenswert?

Kann man dann nicht gleich den ADC mit 8bit betreiben, ich dächte die 
Atmels können das.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Michael Wilhelm (Gast)


Lesenswert?

Ja das geht. In einem Register gibt es ein Bit für Left adjust... Da 
musst du dann explizit das H-Byte auslesen.

MW

von MWS (Gast)


Lesenswert?

@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.

von Christian (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.