mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Bascom m16 ADC Problem


Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: MWS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und wie das falsch ist  ;-)

W = W / 1024 ergibt immer 0

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ups...

klar...

sry und danke

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wie kann ich das lösen?

das problem ist mir klar... jetzt

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
geteilt durch 2 würde ja in dem fall reichen

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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 :-)

Autor: MWS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Shift W, Right, 2

Autor: MWS (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Michael Wilhelm (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: MWS (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.