Hallo bin Neue hir , mit einigen fragen

sucharik

Mitglied
01. Nov. 2011
32
0
6
Bonn
Sprachen
  1. BascomAVR
Hallo ich heiße Sergej bin 31
mit 14-jahren angefangen zu Löten.

Mikrocontroller Atmega kenne ich nich all-so lange
Programieren tu ich es mit Bascom (visual-basic :) )

Frage:
Kann mann den ADC(PC0) Wert erst dann auf die 7-segmentanzeige ausgeben, wenn er sich verändert?
Und so lange wird ADC(PC1) Wert angezeigt.

Danke im vorraus!!!
 
Hallo Sergej!

Dann mal Willkommen im AVR-Praxis Forum! :ciao:


So ganz habe ich deine Frage jetzt nicht verstanden..... :hmmmm:
Möchtest du wissen, ob du nur auf die Veränderung des ADC0 reagieren kannst, oder ob du generell den ADC0 anzeigen lassen kannst?

Ich denke mal, du hast es so gemeint:
Deine 7-Segment Anzeige zeigt dir immer den Wert des ADC1 an.
Wenn sich der ADC0 nun verändert, dann soll plötzlich dieser Wert angezeigt werden.
Stimmt das so?

Letztlich musst du nur den "Referenzwert" des ADC0 in eine Variable speichern und diese dann immer mit dem aktuellen Ergebnis vergleichen.
Wenn dann irgendwann ADC0_referenz <> ADC0_Wert ist, kannst du darauf natürlich reagieren.
Also:
Code:
If ADC0_ref <> ADC0_Wert Then
'Ausgabe auf 7-Segment
Else
'ADC1 anzeigen
End IF

Es fragt sich aber auch, wie lange der neue ADC0-Wert angezeigt werden soll und und und......

Vielleicht hilft dir das Beispiel aber auf die Sprünge.

Grüße,
Cassio
 
Hallo Cassio,

danke für dein Antwort/Hilfe

Ja du hasst es richtig verstanden:

Ich denke mal, du hast es so gemeint:
Deine 7-Segment Anzeige zeigt dir immer den Wert des ADC1 an.
Wenn sich der ADC0 nun verändert, dann soll plötzlich dieser Wert angezeigt werden.
Stimmt das so?

Dein Code: habe ich angewendet, nur es geht immer noch nicht
Also werte springen: wenn ADC1 = 0 wird ADC0 angezeigt 0....255
ADC1 = 1..255 wird ADC1 angezeigt :confused:
Da habe ich bestimt was falch gemascht!
Mein Code:
Code:
Dim Heizen_t As Word
Dim H_t As Word
Dim Stellen_t As Word
Dim S_t As Word
Dim Adc1_ref As Word
Dim Adc1_wert As Word
Do
'=========================== GETADC(0) Heizen_t das ist Temperatur Sensor
'===========================GETADC(1) Stellen_t das ist Temperatur die man braucht
H_t = Getadc(0)
H_t = H_t / 4
S_t = Getadc(1)
S_t = S_t / 4

'Adc1_ref = S_t
Adc1_wert = S_t

If Adc1_ref <> Adc1_wert Then
'======================Ausgabe auf 7-Segment  NUR WENN SICH Ändert
       Stellen_t = S_t
       Einer = Stellen_t Mod 10
       Stellen_t = Stellen_t / 10
       Zehner = Stellen_t Mod 10
       Stellen_t = Stellen_t / 10
       Hundert = Stellen_t Mod 10
       Stellen_t = Stellen_t / 10
       Tausent = Stellen_t Mod 10
       Stellen_t = Stellen_t / 10
Else
'========================ADC0 anzeigen
      Heizen_t = H_t
      Einer = Heizen_t Mod 10
      Heizen_t = Heizen_t / 10
      Zehner = Heizen_t Mod 10
      Heizen_t = Heizen_t / 10
      Hundert = Heizen_t Mod 10
      Heizen_t = Heizen_t / 10
      Tausent = Heizen_t Mod 10
      Heizen_t = Heizen_t / 10
End If
loop
end
Kannst du da was erkenne?


Danke
 
Hallo !

Ich möchte dir ja den Spaß nicht verderben...... aber ich erkenne, dass dein Programm in dieser Form so nicht stabil laufen wird. :wink:

Der Hauptschwachpunkt dabei ist der ADC.
Dieser wird selten immer exakt den selben Wert haben, sondern meist etwas "pendeln".
Du musst also für die ADC-Werte eine gewisse Hysterese einbauen.

Die nächste Frage ist.....
Warum musst du den Sollwert denn unbedingt per ADC einstellen? :hmmmm:
OK, das kann man machen, aber......

Als nächstes solltest du die Trennung der Ziffern für die 7-Segmente umstellen.
Einen vernünftige Möglichkeit wäre die Konvertierung der Zahl ins BCD-Format und die anschließende Aufteilung in einzelne Ziffern.


Insgesamt solltest du das Programm so aufbauen, dass vorrangig der ADC-Wert ermittelt wird und nur in bestimmten Abständen die Anzeige aktualisiert wird (Timer-Interrupt verwenden).


Ich kann zur Zeit nur hoffen, dass du damit nicht wirklich etwas reales ansteuern möchtest.... gerade, wenn es ums Heizen (elektrisch, Gas) geht!

Grüße,
Cassio
 
Hallo!

Nein Nein weder Gas noch Strom:angel:

Mir ging es in erste linie 7-segment/multiplex verfahren zu erlehrnen.
Nun habe das soweit im grif !
Dann wollte ich einfach mit den Werten spielen dahe !Heizen! und so.

Hir ist complete Code:
Bitte nicht schimpfen ist nicht gaz Sauber geschrieben:adore:

Code:
$regfile = "m8def.dat"
$crystal = 1000000
$hwstack = 32       ' default use 32 for the hardware stack
$swstack = 32       'default use 10 for the SW stack
$framesize = 40       'default use 40 for the frame space
'$lib "mcsbyte.lbx"       'ïîäêëþ÷àåì áèáëèîòåêó ôóíêöèé


'===========Ein/Ausgänge=============
Ddrb = &B11111111
Ddrc = &B0000000
Ddrd = &B11001111
Portd.0 = 0 : Portd.1 = 0 : Portd.2 = 0 : Portd.3 = 0


'=============================7 Segmentanzeige
Ziffer_1 Alias Portd.0 : Ziffer_2 Alias Portd.1
Ziffer_3 Alias Portd.2 : Ziffer_4 Alias Portd.3
Segment_a Alias Portb.0 : Segment_b Alias Portb.1 : Segment_c Alias Portb.2
Segment_d Alias Portb.3 : Segment_e Alias Portb.4 : Segment_f Alias Portb.5
Segment_g Alias Portb.6

'=============================ROTE/GRUNE LED Rot=Heizen  Grun= Ok Temperatur erreicht
Heizen_led Alias Portd.6
Erreicht_led Alias Portd.7

'==================================ADC
Config Adc = Single , Prescaler = Auto , Reference = Internal
Enable Interrupts
Start Adc

'===================================Variablen
Dim Ausgang As Byte : Dim Bcd_aus As Byte : Dim Temp_ziffer As Byte
Dim Einer As Byte : Dim Zehner As Byte : Dim Hundert As Byte
Dim Tausent As Byte

On Timer0 7segment
Config Timer0 = Timer , Prescale = 8
Enable Timer0


Dim Heizen_t As Word
Dim H_t As Word
Dim Stellen_t As Word
Dim S_t As Word
Dim Adc1_ref As Word
Dim Adc1_wert As Word

Adc1_ref = S_t
'Adc1_wert = S_t
Do
'=========================== GETADC(0) Heizen_t das ist Temperatur Sensor
'===========================GETADC(1) Stellen_t das ist Temperatur die man braucht
H_t = Getadc(0)
H_t = H_t / 4
S_t = Getadc(1)
S_t = S_t / 4



If Adc1_ref <> Adc1_wert Then
      'Ausgabe auf 7-Segment  NUR WENN SICH eandert
       Stellen_t = S_t
       Einer = Stellen_t Mod 10
       Stellen_t = Stellen_t / 10
       Zehner = Stellen_t Mod 10
       Stellen_t = Stellen_t / 10
       Hundert = Stellen_t Mod 10
       Stellen_t = Stellen_t / 10
       Tausent = Stellen_t Mod 10
       Stellen_t = Stellen_t / 10
Else
      'ADC0 anzeigen
      Heizen_t = H_t
      Einer = Heizen_t Mod 10
      Heizen_t = Heizen_t / 10
      Zehner = Heizen_t Mod 10
      Heizen_t = Heizen_t / 10
      Hundert = Heizen_t Mod 10
      Heizen_t = Heizen_t / 10
      Tausent = Heizen_t Mod 10
      Heizen_t = Heizen_t / 10

End If


'=========================H_T Rote Led Heizen  S_T Rune Led Abkuhlen
If S_t <= H_t Then Set Portd.7 Else If S_t => H_t Then Reset Portd.7
If S_t <= H_t Then Reset Portd.6 Else If S_t => H_t Then Set Portd.6

Waitms 150
Loop
End

7segment:
If Temp_ziffer = 4 Then Temp_ziffer = 0
      Incr Temp_ziffer
   Portb = &B1111111
      Select Case Temp_ziffer
              Case 1 : Ziffer_1 = 1
                       Ziffer_2 = 0
                       Ziffer_3 = 0
                       Ziffer_4 = 0
                       Bcd_aus = Tausent
              Case 2 : Ziffer_1 = 0
                       Ziffer_2 = 1
                       Ziffer_3 = 0
                       Ziffer_4 = 0
                        Bcd_aus = Hundert
              Case 3 : Ziffer_1 = 0
                        Ziffer_2 = 0
                        Ziffer_3 = 1
                        Ziffer_4 = 0
                        Bcd_aus = Zehner
              Case 4 : Ziffer_1 = 0
                        Ziffer_2 = 0
                        Ziffer_3 = 0
                        Ziffer_4 = 1
                        Bcd_aus = Einer
End Select
Select Case Bcd_aus
        Case 1 : Ausgang = Lookup(1 , Segmentfolge)
        Case 2 : Ausgang = Lookup(2 , Segmentfolge)
        Case 3 : Ausgang = Lookup(3 , Segmentfolge)
        Case 4 : Ausgang = Lookup(4 , Segmentfolge)
        Case 5 : Ausgang = Lookup(5 , Segmentfolge)
        Case 6 : Ausgang = Lookup(6 , Segmentfolge)
        Case 7 : Ausgang = Lookup(7 , Segmentfolge)
        Case 8 : Ausgang = Lookup(8 , Segmentfolge)
        Case 9 : Ausgang = Lookup(9 , Segmentfolge)
        Case 0 : Ausgang = Lookup(0 , Segmentfolge)
        'Case 0 And Temp_ziffer = 1 : Ausgang = Lookup(10 , Segmentfolge)
        'Case 0 And Temp_ziffer > 1 : Ausgang = Lookup(0 , Segmentfolge)
End Select

Segment_a = Ausgang.0 : Segment_b = Ausgang.1 : Segment_c = Ausgang.2
Segment_d = Ausgang.3 : Segment_e = Ausgang.4 : Segment_f = Ausgang.5
Segment_g = Ausgang.6
Return

Segmentfolge:       'GFEDCBA/"0" Seg AN
Data &B1000000       '0
Data &B1111001       '1
Data &B0100100       '2
Data &B0110000       '3
Data &B0011001       '4
Data &B0010010       '5
Data &B0000010       '6
Data &B1111000       '7
Data &B0000000       '8
Data &B0010000       '9
Data &B1111111       'Nix
 
Hallo !

Ach Mist.... deine ADC-Werte sind ja jenseits von 159... also war der Tipp mit der Konverteirung ins BCD-Format natürlich Unsinn.

Mal nebenbei.....
Was ich nicht verstehe, warum du den 10bit ADC-Wert durch Vier teilst? :hmmmm:

Ich weiß, dass bestimmt einige Meckern werden.... aber anstatt deine Zahl mit MOD zu zerlegen, mach doch den Schritt über einen String.
Das ist wesentlich einfacher und übersichtlicher.

Zum anschließenden automatischen Zerlegen und "Rückkonvertieren" kannst du dann STR2DIGIT verwenden!

Beispiel:
Code:
Dim H_ts As String * 5
Dim H_ta(6) As Byte



H_t = Getadc(0)

H_ts = str(H_t)
Str2digits H_ts , H_ta(1)

Anschließend hast du im Byte-Array H_ta(1) deine einzelnen Ziffern im Byteformat.

ACHTUNG!
Im ersten Byte befindet sich immer die Summe aller Digits und außerdem werden die Ziffern von Hinten nach Vorn abgespeichert!

Beispiel:
H_t = 11223

H_ta(1) = 5 (weil es fünf Ziffern sind !)
H_ta(2) = 3
H_ta(3) = 2
H_ta(4) = 2
H_ta(5) = 1
H_ta(6) = 1


Beispiel 2:
H_t = 456

H_ta(1) = 3 (weil es drei Ziffern sind !)
H_ta(2) = 6
H_ta(3) = 5
H_ta(4) = 4


OK soweit?

Die enzelnen Ziffern musst du nun nur noch mit den entsprechenden Bitmustern aus dem DATA-Bereich laden und diese dann zur passenden 7-Segment-Anzeige "schicken".


Da du aber deine Ziffern im Multiplexbetrieb verwendest, musst du leider permanent mit einem Timer die Anzeigen ansteuern.
Zwischendurch musst du dann ganz kurz mal den ADC0 und/oder den ADC1 messen und berechnen.....

Das ist manchmal alles gar nicht so einfach wie es sich anhört. :wink:

Kannst ja noch mal einiges ausprobieren und dich dann mit den Ergebnissen (positive wie negative) melden.

Grüße,
Cassio
 
Hallo !

Danke für deine mühe!

Das mit ADC abfrage habe hin gekriegt mit deine Hilfe!:)

Code:
If ADC0_ref <> ADC0_Wert Then
'Ausgabe auf 7-Segment
Else
'ADC1 anzeigen
End IF
 ’=======  Vergleichszustand!?
ADC0_ref = ADC0_Wert ’<- Ohne diese Gleichung wollte es nicht tu.

10bit ADC-Wert durch Vier teilen!
Also habe Poti an GND<-ADC->+5V und wenn.....
Dim Heizen_t As Byte!
dann auf der Anzeige hatte ich 4x 0…255 und 0…255 ….
Daher 1023 / 4 , nur ob es so richtig ist.:hmmmm:

Zahl mit MOD zu zerlegen!
Auf diesen MOD bin auch durch den Zufall gekommen, und es hat
Sofort geklapt. Davor aber 5 Tage lang gesucht!

Das mit dem Schritt über einen String werde ich auf alle fälle ausprobieren!



Sucharik
 
Daher 1023 / 4 , nur ob es so richtig ist.:hmmmm:


Hallo!

Hm, dass kann ich dir nicht sagen, ob das für dich richtig ist.

Der AD-Wandler im AVR ist 10bit breit.
Also kann er Werte von 0-1023 annehmen.

Wenn du ein Poti zwischen GND und Vcc hast, dann.....
0V = 0bit
5V = 1023

Ein Bit hat demnach eine Auflösung von 5V / 1024 = 4,883mV

Wenn dein ADC0 zum Beispiel 513 anzeigt, dann steht dein Potischleifer bei:
513 X 4,883mV = 2,50V

Warum du jetzt aber den ermittelten ADC-Wert durch Vier teilst weiß ich nicht......
Den Sinn dahinter habe ich noch nicht verstanden. :hmmmm:


Grüße,
Cassio
 
Warum du jetzt aber den ermittelten ADC-Wert durch Vier teilst weiß ich nicht......
Den Sinn dahinter habe ich noch nicht verstanden. :hmmmm:

Hallo
Ahso ich wollte halt nuhr kleinen wert haben also..255 sonst ist ja nix dahinter!:victory:

Habe Experimentierboard von Roland Walter nachgebaut
da sind 2 potis GND<< >>+5V.........

Mann kann ja mit zusetzlichen potis auf +2V referensieren und nuhr +2Volt an ADC zu geben.
(ohne den wert wehr mals zu teilen.... oder so)



Gruß
Sucharik
 
Ahso ich wollte halt nuhr kleinen wert haben also..255 sonst ist ja nix dahinter!:victory:

Hallo!

Ja, OK.... aber wozu soll das gut sein? :hmmmm:

Wenn du 1024 durch 4 teilst, dann ergibt das 256.

Damit reduzierst du nachträglich nur die Auflösung, mehr nicht.
Bedeutet also:
Du hast dann nur noch 19,5mV Auflösung.

Wenn wir beim genannten Beispiel bleiben, dann ermittelt dein ADC0 den Wert 513!
513 / 4 = 128
128 x 19,5mV = 2,496V

Es wird also alles immer ungenauer!

Darum verstehe ich den Sinn deiner Rechnung ja auch nicht. :hmmmm:

Grüße,
Cassio
 
Die Frage ist eher warum er, wenn die 8bit-Auflösung ausreicht, nicht gleich den ADC als 8bit auswertet. (ADLAR) Oder bietet "getadc" das nicht? (Selbst dann kann man das ja selbst aus dem Result-Register holen. Was macht getadc eigentlich genau? Die Konversion starten, warten(!) bis das "Fertig-Flag" gesetzt wird, und dann die beiden Result-Register laden?)
 
Hallo

Bin noch Anfänger was programmieren angeht,
daher nicht so viel Ahnung! :pcguru:

Begriffe wie ADLAR, Result-Register sind für mich neu. :confused:

Meine ADC-Wert anzeige funktioniert endlich. Aber die werte springen um
+-2! Ist das denn diese Unstabilität bei ADC? Oder liegt das nur an dem, das zuviel geteilt wird?

Jetzt habe ich vor den ADC durch INT0/INT1 zu ersetzen,
und multiplex durch STRING. :hmmmm:

123 045.jpg

Gruß
Sucharik
 
Ok.
Du verwendest einen ATmega8, korrekt? Zu dem gibts hier das Datenblatt (das lange). Das ist eigentlich alles ganz gut erklärt. Dich interresiert im Moment das Kapitel zum ADC.
Das wesentliche mal in kürze:
-Das sind 8bit-Prozessoren, dh alle Register und der Speicher sind byteweise organisiert.
-Dein Prozessor hat einen ADC, der per sukzessiver Approximation die zu messende Analogspannung mit der (zugewiesenen) Referenzspannung vergleicht (0V=0000000000binär=0dezimal, Uref=1111111111binär=1023dezimal)
-da 10bit nicht in ein Byte passen, wird das ADC-Ergebnis in zwei Bytes abgelegt. Das sind die beiden ADC Data register ADCL und ADCH. Halt das high und das low byte.
-getadc liest nach der vollständigen Wandlung diese Register aus.
-Im ADC MultiplexerSelectionRegister (ADMUX) wird nicht nur festgelegt welcher ADC-Pin ausgelesen werden soll (gibst Du bei getadc in den Klammern an), sondern auch wie die 10 bit in den 2 Ergebnis-Registern (sind ja 16 bit) abgelegt werden sollen. Und zwar mit der Flag ADLAR (ADC left adjust result). Steht da 'ne 0, befinden sich die niderwertigsten bits in ADCL, und die anderen beiden in ADCH (die restlichen bits bleiben 0) - somit kannst Du das direkt als word (halt nur bis 1023) betrachten. Wenn ADLAR=1, werden höherwertigsten 8 bits in ADCH abgelegt, und die letzten beiden in ADCL (bit 7 und 6, der Rest bleibt 0). Somit steht in ADCH also das Ergebnis um 2 (binäre) Stellen nach rechts geschoben. Was dasselbe wie (dezimal)durch vier teilen ist. 0V=00000000binär=0dezimal, Uref=11111111binär=255dezimal. Effektiv verwendest Du so den Konverter als 8bit ADC.

Ich empfehle Dir dringend, mal das Datenblatt zu überfliegen.

P.S.: Willkommen im Forum!
Hmm... Dino noch gar nicht dagewesen?... Nagut, dann eben von mir: :flowers:
 
Hallo LotadaC!

Super erklärt!
Ob er diese Information zum jetzigen Zeitpunkt aber schon verstehen und umsetzen kann.......
da bin ich ein wenig skeptisch. :hmmmm:



Hallo Sergej!

Nur mal nebenbei.....
das Zerlegen deines Wertes über String hat nichts mit dem Multiplexen zu tun.
Daran ändert sich nichts.

Hast du denn nur das Experimentierboard vor dir liegen, oder auch ein passendes Buch mit Beispielen?
Wie ich gesehen habe, hast du auch ein LCD.
Vielleicht solltest du dies erst mal verwenden, damit du dir auch ein paar Variablen ansehen kannst.
Besser wäre noch eine serielle Schnittstelle zum PC. Hast du die auch?

Momentan hast du dir mit dem ADC, 7-Segmente und Multiplexen gleich drei Aufgaben gestellt.
Das ist zu Beginn schon recht heftig!
Wenn jetzt irgendetwas nicht so klappt wie gedacht, dann suchst du ggf. an der falschen Stelle....

Wie aber eben schon gefragt.... Wichtig wäre zu wissen, ob du die serielle Schnittstelle verwenden kannst.

Grüße,
Cassio
 
Hallo LotadaC!

Als erstes Danke euch!

Habe etwas Zeit gebraucht um alles zu verarbeiten.....

Denn stelle ich jetzt aus meine sich die Zwei (10bit und 8bit) Variante vor.

Programm Code 10bit.. ADC0-ADC5(Atmega8)
Bei einem 10bit verfahren wird ADC mit Config und Getadc() angesprochen
Und hat einen Wert 0...1023.

Code:
Config ADC= Single , Prescaler=Auto , Reference=Internal
Enable Interrupts
Start ADC

Dim W as Word 
'   W als Word = 0-1023 
'   W als Byte = 0-255-0-255-0-255-0-255

Do
	W=getadc(0) ‘[COLOR="#FF0000"]10bit ADC wird immer mit Get.. angesprochen?[/COLOR]
        Print ; “Wert: “ ; W
Loop
End

Ich hoffe so weit alles richtig und vollständig.

Programm Code 8bit.. ADC0-ADC5(Atmega8)

Bei einem 8bit verfahren wird ADC direkt im DDR angesprochen
ADCMUX =&B01100000
ADCSRA = &B11100010
ADCH
ADCL
Code:
DDRC = &B00000000

'mux   Bits7+6=01:Ref intern
'mux   Bit5=1: LeftAdjust, nur 8 Bit in ADCH
'mux   Bit3..0: ADC Kanal wählen
ADMUX = &B01000000

'sra   Bit7=1:AdcAn  Bit6=1:Start  Bit5=1:Frei
'ars   Bit3=0:InterruptAn  Bit2..0=010: AvrClock/4
ADCSRA = &B11100010
Do
   Print ; "Wert H: " ; ADCH
   Print ; "Wert L: " ; ADCL   
Loop
end
Habe 8bit code mal im Bascom Simulator getestet:
ADCH hat mir nur 0…1…2…3 angezeigt!
ADCL dagegen 0 bis 255


Ich empfehle Dir dringend, mal das Datenblatt zu überfliegen.

Datenblatt habe ich mir mal angeguckt und nur Bilder konnte ich verstehen
Englisch=0 . Aber einige Sachen aus dem ADC Kapitel habe ich mir übersetzt
Muss nur noch lesen!



Hallo Cassio!

Hast du denn nur das Experimentierboard vor dir liegen, oder auch ein passendes Buch mit Beispielen?
Wie ich gesehen habe, hast du auch ein LCD.
Vielleicht solltest du dies erst mal verwenden, damit du dir auch ein paar Variablen ansehen kannst.
Besser wäre noch eine serielle Schnittstelle zum PC.

Habe das Buch und auch die Beispiele ist alles vorhanden.
Mein Projekt mit ( Heizen_T, Stellen_T) habe ich auf dem LCD angefangen
und es hab geklapt, sogar mit Volt-Anzeige .
Aber die sache mit 7-Segment fand ich spannender, nun bin im Forum gelandet
wo mir auch geholfen wurde.

serielle Schnittstelle habe ich auch, und einige Beispiele damit getestet
als Programm habe ich AVR Terminal verwendet.

Gruß
Sucharik
 
@rote Frage: Nein, der ADC löst immer auf 10bit auf, wenn er mit ADSC (oder im free running mode) gestartet wurde. Jetzt stelle Dir die beiden ADC-Data-Register als ein 16bit Register vor. ADLAR legt fest, ob das 10bi Ergebnis links oder rechtsbündig dort abgelegt wird. Wenn ADCL ausgelesen wird, werden beide(?) Register blockiert, bis auch ADCH ausgelesen wurde - somit kann der ADC also zwischendurch nicht neue Werte nach ADCH schreiben, und Deine Werte stimmen/passen zusammen.
Wenn ADLAR=1 steht im ADCH automatisch das 8bit Ergebnis (die beiden niderwertigsten Bits in ADCL hast Du ja vernachlässigt), und das Auslesen von ADCH gibt die Register wieder frei. In dem Fall reicht also das Auslesen von ADCH aus.
getadc ist nur ein ... äh ... Macro/eine sub, die die beschriebenen Register setzt/auswertet. Was/Wie genau getadc das macht, weiß ich nicht. Ich vermute(!), daß es den ADC initialisiert (ua den entsprechenden mux wählt), mit ADSC eine single-conversion startet, danach das interrupt-flag solange pollt, bis es gesetzt wird, und dann beide Ergebnis register ausliest (und an eine Word Variable übergibt).
Das kannst Du "zu Fuß" genau so machen, Du hast aber dann mehr Möglichkeiten. (siehe ADLAR, free running mode, beim Mega88 (der 8ter ist obsolete, der 88er ist der Nachfolger) kann der ADC auch automatisch gestartet werden (durch einen Timer, den Comperator,...)
Außerdem kannst Du den ADC im Hintergrund laufen lassen, während Dein Hauptprogramm was anderes tut. Er meldet sich dann mit eine "hab fertig Interrupt" zurück. (Hintergrund: ADC-Clock sollte nicht schneller als 200kHz laufen (deswegen der Prescaler), eine single conversion dauert 25 ADC-clock-Zyklen. Das sind für den Prozessor Ewigkeiten.)

Daß ADCH beim right adjusted result (ADLAR=0) nie über 3 kommt ist klar, es werden ja nur die beiden niderwertigsten bits beschrieben - die anderen bits sind immer 0. Nur daß das bit 0 hier für 256 steht, und das bit 1 für 512. zusammen mit ADCL kommste dann auf die 10bit (von 0 bis 1023)
 
Das kann ich Dir jetzt nicht so einfach beantworten. In Assembler ist das so:
-Du hast 32 byte Register. Das ist sowas wie Dein Schreibtisch. Nur hier kannst Du "rechnen" bzw die bytes manipulieren.
-Du hast den Speicher (SRAM - Arbeitsspeicher) - davon ist ein Teil fest mit der Hardware des Prozessors "verdrahtet" (das sind die klingenden Namen, mit denen Du irgendwas erreichen kannst), der Rest ist halt freier Speicher.
-Wenn Du jetzt also ein bestimmtes bit in einem de I/O-Register setzen, oder löschen willst, mußt Du das bitmuster des kompletten I/O-register in Deinem Arbeitsregister (Schreibtisch) erzeugen, und dann ins I/O kopieren
-wenn andere Bits dieses Registers unbekannt sind, und nicht verändert werden sollen, muß folglich erst das Register auf den Schreibtisch geladen werden, dann das entsprechende Bit manipuliert werden, und dann das Ergebnis wieder ins I/O-Register geschrieben werden. (read-modify-write).
-Für einige I/O-Register gibt es dann noch die Möglichkeit, einzelne Bits unabhängig vom Restlichen Register zu lesen und schreiben (und zwar alle Register bis 0x1F - beim Mega8 ist Register 0x07 ADMUX und 0x06 ADCSRA (Datenblatt S.280))

Mit der Bascom-Zuweisung "Registername = Byte" gehst Du den ersten Weg.
Für den 2ten wird es in eine Konstrukt in der Art "Registername.bitname=1" geben.
Daß der dritte Weg von Bascom genutzt wird, bezweifle ich jetzt einfach mal.
Was sich hinter diesen kurzen Bascom-Befehlen verbergen kann, kannst Du zB. hier nachlesen...
 
Hallo Cassio

Zum anschließenden automatischen Zerlegen und "Rückkonvertieren" kannst du dann STR2DIGIT verwenden!

Beispiel:
Code:
Dim H_ts As String * 5
Dim H_ta(6) As Byte



H_t = Getadc(0)

H_ts = str(H_t)
Str2digits H_ts , H_ta(1)

mein Bascom 1.11.9.8 kennt kein Str2digits!!!
gibt es was anderes?:victory:

gruß
sergej
 
Hallo Sergej!

Hm... tja.... wenn du einen Vollversion dein Eigen nennst, dann kannst du bei MCS kostenfrei auf die aktuelle Version updaten.......
sofern du irgendwann schon mal einen Zugang beantragt hast.

Wenn du den Befehl nicht nutzen kannst, dann lass das Umwandeln so wie du es derzeit hast!
Es funktioniert ja schließlich und verstanden hast du es bestimmt auch. :wink:


Grüße,
Cassio
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)