Bascom 2 Analogwerte mit einem ADC

dimmu

Neues Mitglied
11. Juli 2011
54
0
0
Schömberg bei Neuenbürg
Sprachen
  1. BascomAVR
Hallo zusammen,
schon ein paar Mal habe ich im Forum gute Hilfe bekommen.

Seit 2 Tagen stehe ich vor einem neuen Problem und komme mal wieder nicht weiter.
Ich habe einen atmega 8 an dem ich einen poti angeschlossen habe um analogwerte einzulesen.
Als Ausgabe benutze ich eine led.
Es sind auch noch 3 Taster angeschlossen um zu unterscheiden.

Jetzt zum eigentlichen vorhaben.
Ich würde gerne mit einem poti 2 analogwerte einlesen.
Ich habe mir das so vorgestellt das ich mit einem Taster den Controller in den Lernmodus versetzten kann, und mit den anderen 2 zwischen den 2 analogwerten wechseln kann.
also es soll dann so sein das ich den lerntaster drücke und den Taster für analog1. Dann stelle ich mit dem poti die gewünschte Helligkeit ein. Danach drücke ich den lerntaster und den Taster für analog2 und stelle mit demselben poti die zweite Helligkeit ein.

Nach dem loslassen der lerntaste sollen die analogwerte in variablen gespeichert sein.
Wenn ich nun nur den Taster für analog1 drücke soll die pwm diesen Wert einstellen.
Wenn ich den Taster für analog2 drücke soll die pwm diesen Wert einstellen.

Ich habe auch schon ein bisschen Code geschrieben, der geht nur nicht so wie ich es gerne hätte.
Solange ich die lerntaste drücke mach die pwm genau das was sie soll. Sobald ich sie jedoch loslasse wird der analogwert sofort wieder gelöscht.

Ich hoffe ihr versteht was ich gerne hätte.
Ich danke schon mal für eure Hilfe
 

Anhänge

  • analogtest.bas
    1,5 KB · Aufrufe: 34
Hallo Dimmu!

Als Erstes stelle ich deinen kleinen Test-Programm-Code hier mal direkt ein. :wink:
So können alle schneller einen Blick auf den Code werfen.

Code:
$regfile = "m8def.dat"                                      'es handelt sich um einen Atmega8
$crystal = 1000000                                          'Taktefrequenz ist 1Mhz
$hwstack = 100                                              'legt den hardware stack fest
$swstack = 100                                              'legt den software stack fest
$framesize = 42

Config Portc.1 = Input
Config Portd.0 = Input
Config Portd.1 = Input
Config Portd.2 = Input
Config Portb.3 = Output

'Konfiguration ADC
Config Adc = Single , Prescaler = Auto , Reference = Avcc   'es wird ADC benutzt
Start Adc                                                   'ADC wird gestartet
'Konfiguration Pwm
Config Timer2 = Pwm , Compare Pwm = Clear Down , Prescale = 1       'Timer2 macht pwm

Dim Analog1 As Word
Dim Analog2 As Word

Do

'Analogwert einlesen und Speichern
If Portd.2 = 1 Then                                         'Portd.2 ist der lerntaster
   If Portd.0 = 1 Then                                      'Portd.0 wählt analog1 aus
   Analog1 = Getadc(1)
   Elseif Portd.1 = 1 Then                                  'Portd.1 wählt analog2 aus
   Analog2 = Getadc(1)
   End If
End If

Analog1 = Analog1 / 4
Analog2 = Analog2 / 4

'Analogwert ausgeben
If Portd.0 = 1 Then                                         'Portd.0 wählt analog1 aus
Compare2 = Analog1
Elseif Portd.1 = 1 Then                                     'Portd.1 wählt analog2 aus
Compare2 = Analog2
Else
Compare2 = 0
End If


Loop


Wenn ich das richtig sehe, liegt dein Problem wohl eher an der fehlenden schrittweisen Erweiterung. :wink:
Was ist also zu tun....

- Als Erstes solltest du nur Versuchen einen gerade eingestellten ADC-Wert mittels Tasterdruck abzuspeichern.

- Wenn dir das gelungen ist, versuche einen zweiten Wert in einer zweiten Variable abzuspeichern.


Erst wenn das problemlos funktioniert, kannst du den zweiten Schritt machen und die Werte einzeln aufrufen..... und dann an den PWM übergeben.

Mach dir einfach noch mal ein paar Gedanken darüber und wenn du bei einzelnen Teilen nicht weiter kommst, haben wir bestimmt noch mal einen Tipp für dich.
Momentan klingt deine Frage leider so, als würdest du nur auf einen fertigen Code von Anderen warten. :wink:

Grüße,
Cassio
 
Hi,

Nach dem loslassen der lerntaste sollen die analogwerte in variablen gespeichert sein.
Wenn ich nun nur den Taster für analog1 drücke soll die pwm diesen Wert einstellen.
Wenn ich den Taster für analog2 drücke soll die pwm diesen Wert einstellen.

Ich habe auch schon ein bisschen Code geschrieben, der geht nur nicht so wie ich es gerne hätte.
Solange ich die lerntaste drücke mach die pwm genau das was sie soll. Sobald ich sie jedoch loslasse wird der analogwert sofort wieder gelöscht.
so weit so klar ....

Code:
'Analogwert ausgeben
If Portd.0 = 1 Then                                         'Portd.0 wählt analog1 aus
Compare2 = Analog1
Elseif Portd.1 = 1 Then                                     'Portd.1 wählt analog2 aus
Compare2 = Analog2
Else
Compare2 = 0
End If
Mach dir einfach noch mal ein paar Gedanken darüber und wenn du bei einzelnen Teilen nicht weiter kommst, haben wir bestimmt noch mal einen Tipp für dich.
Momentan klingt deine Frage leider so, als würdest du nur auf einen fertigen Code von Anderen warten. :wink:
ich hab mal nen Teil deines Programmes rausgeschnitten.
Sieh ihn dir mal genauer an und geh ihn im Kopf durch. Ich glaube du wirst den Fehler finden ;)

Am meisten Spaß macht es wenn man nicht was vorgekautes verwendet hat sondern etwas selber zum laufen bekommen hat ;) Dann kann man ruhig stolz auf sich sein :cool:

Wenn Du komplett feststeckst kannst du aber auch auf Hilfe von uns hoffen ;) Einen kleinen Tip hast du ja nun schon.

Gruß
Dino
 
Hi
Ich hab zwar keine Ahnung von Bascom, dennoch vermute ich mal, das in der Do ... Loop die beiden Analog1 und -2 Variablen ganz schnell auf "0" gerechnet werden..... :wink:
Code:
do
.....
Analog1 = Analog1 / 4
Analog2 = Analog2 / 4
.....
loop
Gruß oldmax
 
Hi Oldmax,

Hi
Ich hab zwar keine Ahnung von Bascom, dennoch vermute ich mal, das in der Do ... Loop die beiden Analog1 und -2 Variablen ganz schnell auf "0" gerechnet werden..... :wink:
Code:
do
.....
Analog1 = Analog1 / 4
Analog2 = Analog2 / 4
.....
loop
ups ... noch garnicht gesehen ;) stimmt. Das auch noch. Das geht in Millisekunden ;)

Ich hatte aber noch folgendes ...
Nach dem loslassen der lerntaste sollen die analogwerte in variablen gespeichert sein.
Wenn ich nun nur den Taster für analog1 drücke soll die pwm diesen Wert einstellen.
Wenn ich den Taster für analog2 drücke soll die pwm diesen Wert einstellen.


Ich habe auch schon ein bisschen Code geschrieben, der geht nur nicht so wie ich es gerne hätte.
Solange ich die lerntaste drücke mach die pwm genau das was sie soll. Sobald ich sie jedoch loslasse wird der analogwert sofort wieder gelöscht.
Das habe ich darauf bezogen das der PWM-Ausgang beim Taster loslassen sofort auf 0 geht.

Das stimmt ja auch wenn man in die If/Elsif/Else sowas schreibt ...
Code:
Else
Compare2 = 0
Taster losgelassen und der PWM ist auf 0.

Ich glaube,da muß er nochmal etwas tiefergreifender erklären was er genau machen will und sich nochmal ein paar Gedanken zum Programmablauf machen.

Gruß
Dino
 
Hallo alle zusammen.
So wie es aussieht habe ich meinen Wunsch nicht so formuliert dass ihr es versteht. Nicht weiter schlimm, ich versuche es nochmal.

Ich will eigentlich keine fertige Lösung von euch sondern mehr so einen Wink in die Richtung.

Zuerst versuche ich nochmal zu erklären was ich vorhabe.

Das Ganze soll eine Steuerung für ein Licht werden.
Wenn keine Taste gedrückt ist soll das Licht aus sein.
Wenn die taste für maximale Helligkeit gedrückt ist soll es so hell leuchten wie bei maximal eingestellt
Wenn die Taste für minimale Helligkeit gedrückt ist soll es so dunkel leuchten wie minimal eingestellt.
Maximal und minimal soll mit demselben poti eingestellt werden. Aus diesem Grund gibt es noch die lerntaste.
Ich ändere den Code jetzt mal ein bisschen so dass es mit den Namen übereinstimmt und schreibe dann dazu was ich mir gedacht habe und an welcher Stelle meine Gedanken nicht mehr weiter kommen.
Code ist immer Rot
Config Portc.1 = Input
'analogeingang
Config Portd.0 = Input
Hellmax Alias Portd.0
Config Portd.1 = Input
Hellmin Alias Portd.1
Config Portd.2 = Input
Lern Alias Portd.2
Config Portb.3 = Output
'pwm ausgang

'Konfiguration ADC
Config Adc = Single , Prescaler = Auto , Reference = Avcc 'es wird ADC benutzt
Start Adc 'ADC wird gestartet
'Konfiguration Pwm
Config Timer2 = Pwm , Compare Pwm = Clear Down , Prescale = 1 'Timer2 macht pwm

Das oben sollte ja soweit klar sein.

Dim Analogmax As Word
Dim Analogmax2 As Byte
Dim Analogmin As Word
Dim Analogmin2 As Byte

Ich habe die variable jetzt mal in Wörter umbenannt die es deutlicher machen was für werte sie enthalten

Do

'Analogwert einlesen und Speichern
If Lern = 1 Then 'Portd.2 ist der lerntaster
If Hellmax = 1 Then 'Portd.0 wählt analog1 aus
Analogmax = Getadc(1)
Elseif Hellmin = 1 Then 'Portd.1 wählt analog2 aus
Analogmin = Getadc(1)
End If
End If

In dem Teil analogwert einlesen und speichern war der Gedanke durch drücken der lerntaste den Controller in den Lernmodus zu versetzen.
Also lerntaster drücken und dann die Helligkeit für max. einstellen durch drücken der Taster hellmax
Und für Helligkeit min eben die hellmin taste.
An der Stelle sehe ich auch schon das Problem des ganzen Programmes. Je nach dem welcher Taster gedrückt wird die entsprechende variable mit dem adc wert geladen. Das geht ja auch so weit. Wenn ich die taste jedoch loslasse ist die if Bedingung nicht mehr erfüllt und die variable ist wieder leer.

Analogmax2 = Analogmax / 4
Analogmin2 = Analogmin / 4

Die Teilung mache ich um den 1024 Werte des Word in 255 des Bytes umzurechnen. Meines Wissens kann die pwm nur werte bis 255. Der adc macht aber werte bis 1024.

'Analogwert ausgeben
If Hellmax = 1 Then 'Portd.0 wählt analog1 aus
Compare2 = Analogmax2
Elseif Hellmin = 1 Then 'Portd.1 wählt analog2 aus
Compare2 = Analogmin2
Else
Compare2 = 0
End If


Loop

Im letzen Bereich geht es dann nur noch rein um die Ausgabe. Ich habe ja schon erwähnt dass ich das Licht aushaben will wenn keine Taste gedrückt ist. Deshalb das else Compare = 0. Ansonsten wähle ich ja durch das if aus mit welchem Wert die pwm ausgeben soll. Also entweder durch drücken der taste hellmax eben den Wert der in der variable analog max seht oder eben dasselbe mit min.

So wie ich das sehe ist das Problem im Lernmodus. Da nach dem loslassen der lerntaste die Bedingungen zum einen Wert in die variable laden nicht mehr erfüllt sind geht die variable wieder auf 0.
Ich dachte es gibt da vielleicht einen Befehl mit dem ich der variable den Wert zuweisen kann und er gespeichert bleib bis ich ihn wieder neu zuweise. Ähnlich wie bei set und reset. Ich habe aber noch nichts Passendes gefunden und weiß auch nicht obs da was Fertiges dazu gibt oder ob das eine riesen Aufgabe ist.
Ich hoffe ihr versteht jetzt was ich gerne machen würde. Wo das Problem an meinem Code ist weiß ich, ich weiß nur nicht wie ich es lösen kann. Wie gesagt ich will keine fertige Lösung, es ist nur so dass ich mir jetzt schon fast eine Woche den Kopf darüber zerbreche und keinen neuen Ansatz finde.
Es wäre nett wenn mir jemand bestätigen könnte das ich an der richtigen Stelle den Fehler vermute und ob der Rest dann soweit stimmt.

Vielen dank
 
Hallo zum zweiten mal.
Ich bin gerade nochmal die bascom befehlsliste durchgegangen. Ich bin jetzt bei dem swap Befehl hängen geblieben. Könnte der mir weiterhelfen. Ich denke daran in der lernphase die variable die den adc wert enthält mit einer variable außerhalb der lernphase auszutauschen. Kann das so funktionieren?
Danke und schönen Abend
 
Hi
Die Teilung mache ich um den 1024 Werte des Word in 255 des Bytes umzurechnen. Meines Wissens kann die pwm nur werte bis 255. Der adc macht aber werte bis 1024.
Meines Wissens kann man aber den ADC so einstellen, das er nur einen 8Bit Wert liefert. Wie es in Assembler geht, ist mir klar, aber deine Teilung sollte auch funktionieren, wenn sie gleich nach dem Einlesen erfolgt und nicht in der Hauptschleife. Da wird auch die Teilung vollzogen, wenn du keinen neuen Wert bekommst und das läuft dann so ab:
zb. A=1023 / 4 =255
> A = 255 / 4 = 63
> A = 63 / 4 = 15
> A= 15 / 4 =3
> A = 3 / 4 =0 da de höchste 10-Bitwert 1024-1 ist, muß auch immer mit den Ganzzahlen so gerechnet werden. Nach nur 5 Zyklen ist dein eingelesener Wert 0
Ändere wie folgt

Code:
Do
 
'Analogwert einlesen und Speichern
 If Lern = 1 Then 'Portd.2 ist der lerntaster
 If Hellmax = 1 Then 'Portd.0 wählt analog1 aus
 Analogmax = Getadc(1)
[COLOR="#008000"]Analogmax =Analogmax /4[/COLOR]
 Elseif Hellmin = 1 Then 'Portd.1 wählt analog2 aus
 Analogmin = Getadc(1)
[COLOR="#008000"]Analogmin =Analogmin/4[/COLOR]
 End If
 End If
Die anderen Zeilen entfernst du. Damit bleibt dein eingelesener ADC-Wert zumindest erst mal erhalten.
Gruß oldmax
 
Hallo zusammen.
Mittlerweile habe ich eine neue Version geschrieben die jetzt so funktioniert wie ich es gerne hätte.
Oldmax hat geschrieben das man den adc auch so einstellen kann das er nur 8 Bit werte liefert.
Das würde ich noch gerne in meinem Code umstellen.

Code:
'Konfiguration ADC
Config Adc = Single , Prescaler = Auto , Reference = Avcc   'es wird ADC benutzt
Start Adc                                                   'ADC wird gestartet
'Konfiguration Pwm
Config Timer2 = Pwm , Compare Pwm = Clear Down , Prescale = 1       'Timer2 macht pwm

Dim Analogmax As Word
Dim Analogmax1 As Word
Dim Analogmin As Word
Dim Analogmin1 As Word


Do

'Analogwert einlesen und Speichern
If Lern = 1 Then                                            'Portd.2 ist der lerntaster
   If Hellmax = 1 Then                                      'Portd.0 wählt analog1 aus
   Analogmax = Getadc(1)
   Analogmax = Analogmax / 4
   Swap Analogmax , Analogmax1
   Elseif Hellmin = 1 Then                                  'Portd.1 wählt analog2 aus
   Analogmin = Getadc(1)
   Analogmin = Analogmin / 4
   Swap Analogmin , Analogmin1
   End If
End If


'Analogwert ausgeben
If Hellmax = 1 Then                                         'Portd.0 wählt analog1 aus
Compare2 = Analogmax1
Elseif Hellmin = 1 Then                                     'Portd.1 wählt analog2 aus
Compare2 = Analogmin1
Else
Compare2 = 0
End If


Loop

Ich habe schon in der bascom Hilfe gesucht und nicht wirklich was dazu gefunden. Ich muss aber auch dazu sagen dass mit der Hilfe nicht richtig umgehen kann. Ich denke dafür fehlen mir noch zu viele Grundlagen.
Auf jeden Fall habe ich deshalb das Internet befragt und auch etwas dazu gefunden. Wenn ich alles richtig verstanden habe muss ich etwas in der admux variable ändern.
Die genaue Einstellung kann ich wohl aus dem datenblatt des maga8 lesen. Das Problem ist das ich aber auch im datenblatt lesen nicht gerade der stärkste bin.

Vielleicht kann mir jemand ein bisschen unter die Arme greifen und mir den einen oder anderen Tipp geben wie man in Kombination mit dem datenblatt und der bascom Hilfe den adc so eingestellt bekommt das er 8 Bit werte liefert.

Bei der Suche wie ich den adc wert einstelle bin ich auch noch über etwas anderes gestolpert das mich ein bisschen interessieren würde.
Ich meinem Uhrenprojekt benutze ich auch einen adc. Mit der Hilfe von Sebastian ist auch schon ein guter Code entstanden. Dort ist jedoch das Problem das der adc das Programm langsam macht.
Ich habe also bei der Suche gelesen dass ich den adc zu einem bestimmten Zeitpunkt starten kann und den Wert dann abhole wenn der analog digital converter fertig ist.
Kann ich das bei meinem mega8 auch machen. Das was ich im Internet gefunden habe bezieht sich auf einen atmega644.
Aber vielleicht mache ich mit diesem Problem dann lieber ein neues Thema auf

Vielen dank
 
SchriftartGröße




Hi
Vielleicht hilft dir ein kleiner Codeauszug aus meinen Assemblerlistings. Es geht einfach darum, wie der ADC-Wert ausgerichtet ist.

Code:
;* Hier mal die Beschreibung der Bits im Steuerregister ADMUX                                                 *
;* Bit 0- Bit 3	Kanal		Mux3 Mux2 Mux1 Mux0				*		  
;*				0     0    0    0	= Kanal 0  	= Port C0		*
;*				0     0    0    1	= Kanal 1	= Port C1		*
;*				0     0    1    0	= Kanal 2	= Port C2		*
;*				0     0    1    1	= Kanal 3	= Port C3		*
;*				0     1    0    0	= Kanal 4	= Port C4		*
;*				0     1    0    1	= Kanal 5 	= Port C5		*
;* Bit 4 n.belegt									*
[COLOR="#00FF00"];* Bit 5 Ausr. 0 = rechts (000000xx xxxxxxxx) 1 = links (xxxxxxxx xx000000)                           *[/COLOR];
* Bit 6 und 7 Auswahl Referenzspannung	Refs1  Refs0				*
;*					  0      0	= externe Referenz			*
;*					  0      1	= Interne Referenz AVCC		*
;*					  1      0	= n.Benutzt			*
;*					  1      1	= interne Referenz 2,56 V		*
;*										*
;* und das Register mit den Bits 	Bit 0 = ADPS0	= Vorteiler 000 =1    	              *
;*				Bit 1 = ADPS1   = 001-111 = 2,4,8,16,32,64 und 128      *
;*				Bit 2 = ADPS2 					*
;*				Bit 3 = ADIE =ADC Interrupt Enable 1 Interrupt bei ADIF * 
;*				BIt 4 = ADIF =ADC Interrupt Flag   1 bei Ende Messung   *
;*				Bit 5 = ADFR =ADC Free Running     1 aut.Start n. Wandl.*
;*				Bit 6 = ADSC =ADC Start Conversion 1 =Start Wandl.0=Ende* 
;*				Bit 7 = ADEN =ADC Enable 1 = ADC ein		* 
;*										*
;* Ergebnis 10 Bit steht in ADCH (High) und ADCL (Low)					*
;******************************************************************************

Das Bit 5  von ADMUX ist dafür verantwortlich. Setzt du es, dann steht in dem High-Byte die obersten 8 Bit. 
Gruß oldmax
 
Hallo oldmax.
Dein Auszug hilft mir schon ein gutes Stück weiter.
Den oberen Teil habe ich verstanden glaube ich. Ich mache mal 3 bespiele und du kannst mich ja dann korrigieren wenn ich mich täusche.
;* Hier mal die Beschreibung der Bits im Steuerregister ADMUX *
;* Bit 0- Bit 3 Kanal Mux3 Mux2 Mux1 Mux0 *
;* 0 0 0 0 = Kanal 0 = Port C0 *
;* 0 0 0 1 = Kanal 1 = Port C1 *
;* 0 0 1 0 = Kanal 2 = Port C2 *
;* 0 0 1 1 = Kanal 3 = Port C3 *
;* 0 1 0 0 = Kanal 4 = Port C4 *
;* 0 1 0 1 = Kanal 5 = Port C5 *
;* Bit 4 n.belegt *
;* Bit 5 Ausr. 0 = rechts (000000xx xxxxxxxx) 1 = links (xxxxxxxx xx000000) *;
* Bit 6 und 7 Auswahl Referenzspannung Refs1 Refs0 *
;* 0 0 = externe Referenz *
;* 0 1 = Interne Referenz AVCC *
;* 1 0 = n.Benutzt *
;* 1 1 = interne Referenz 2,56 V *

Wenn ich also schreibe
Admux = &b 00000000
Dann habe ich portc.0 ausgewählt mit einer 10 Bit Auflösung und externer Referenz Spannung
Admux = &b 01010011
Dann habe ich portc.5 ausgewählt mit einer 10 Bit Auflösung und interner Referenz Spannung 2,56V.
Admux = &b 00010100
Dann habe ich portc.1 ausgewählt mit einer 8 Bit Auflösung und externer Referenz Spannung.
Das Bit 5 ist verantwortlich für die 8 Bit Auflösung sagt du. Das habe ich noch nicht ganz verstanden wie das funktioniert mit dem high byte und low byte.
Also das ich bei 10 Bit Auflösung habe brauche ich 2 Byte das ist mir klar. Was ändert das aber wenn ich umstelle ob es rechts oder links ausgerichtet ist.

;* Bit 0 = ADPS0 = Vorteiler 000 =1 *
;* Bit 1 = ADPS1 = 001-111 = 2,4,8,16,32,64 und 128 *
;* Bit 2 = ADPS2 *
;* Bit 3 = ADIE =ADC Interrupt Enable 1 Interrupt bei ADIF *
;* Bit 4 = ADIF =ADC Interrupt Flag 1 bei Ende Messung *
;* Bit 5 = ADFR =ADC Free Running 1 aut.Start n. Wandl.*
;* Bit 6 = ADSC =ADC Start Conversion 1 =Start Wandl.0=Ende*
;* Bit 7 = ADEN =ADC Enable 1 = ADC ein *
Und jetzt zu dem unteren teil. Da ist das ganze schon nicht mehr so klar.
Als erstes Mal wie heißt das Register in dem diese 8 Bit stehen.
Adsp bedeutet Vorteiler wenn ich die Aufstellung richtig deute. Der Vorteiler setzt sich dann aus Bit 0-2 zusammen. Also
000 = Vorteiler 1 ,001= Vorteiler 2, 010 = Vorteiler 4, 011 = Vorteiler 8, 100 = Vorteiler 16, 101 = Vorteiler 32, 110 = Vorteiler 64 und 111 Vorteiler 128.
Woher weiß ich den wie ich den Vorteiler einstellen muss.
ADIE das Bit muss ich auf 1 setzen um den Interrupt von ADIF zu nutzen
ADIF das Bit müsste ja dann vom Controller gesetzt werden oder sehe ich das falsch. Den Interrupt muss ich dann in der Interrupt Routine abarbeiten.
ADFR kann ich mir gar nichts dazu erklären
ADSC wenn ich den im Programm auf 1 setze fängt der Controller an den analogwert zu wandeln
ADEN damit kann ich den adc ein und ausschalten.

Danke für deine Geduld
Grüße Timo
 
Hi
Bevor ich hier was falsches sage: schau ins Datenblatt vom Atmega 8. Einfach bei Google "Atmega" eingeben und das PDF-File laden. Dort steht zum Prescaler irgendwas mit Sample-Rate. Da mein Englisch noch aus den 60er Jahren stammt, tu ich mich mit der Sprache ein wenig schwer, aber so wie ich es sehe, kann damit die Schnelligkeit und Genauigkeit der Wandlung beeinflusst werden. Stichwort Abtastrate. Ich steck da nicht so tief drin
Die Geschichte mit der 8Bit-Einstellung, da bin ich mir ebenfalls nicht sicher, ob du mit Bascom den direkten Zugriff auf die Register hast. In Assembler jedenfalls ist diese Einrichtung recht nützlichg, da in den meisten Fällen die 8Bit-Auflösung völlig ausreicht. Merke: 10Bit werden 2 Byte, also High- und Lowbyte vom ADC, also ADCH und ADCL benötigt. Bei einer 8 Bit-Auflösung werden auch 10 Bit aufgelöst, aber die Bits in den High-Bereich verschoben. So ist im ADCH-Register halt der 8 Bit-Wert. Die niederwertigen 2 Bits sind im ADCL Register und können unbewertet bleiben.
Zu den anderen Bits steht auch ne aMenge im Datenblatt. Du wirst früher oder später sowieso da reinschauen müssen, da wohl niemand die immensen Infos im Kopf haben kann. Auch ich hab bezüglich des Prescalers nochmal reingesehen.
Gruß oldmax
 
Hi oldmax.
Das man nicht alle Infos im Kopf haben kann versehe ich natürlich, das verlangt ja auch niemand.
Das datenblatt von dem mega8 habe ich vorliegen, sogar in ausgedruckter Form. Das Problem bei mir ist nur das ich nie der beste in Englisch war, dementsprechend habe ich au so meine Probleme das zu verstehen was da steht.
Auf jeden Fall danke ich dir für deine Einweisung in die Tiefen des adc.
Ich habe mir jetzt mal die deutsche Übersetzung der bascom Hilfe bestellt. Ich hoffe das da auch noch ein bisschen was darüber drin steht. Ansonsten wird Google ja auch noch ein bisschen was darüber wissen.

Grüße Timo
 
Hallo Timo,

ich schalte mich mal kurz dazwischen.

Das mit den Bits im Register ADMUX hast du soweit verstanden. Das niederwertigste Bit0 ist allerdings rechts, das höchstwertige Bit7 links. Du hast es verdreht, dadurch stimmen deine Beispiele nicht.

Wenn du nur 8bit benötigst, bietet es sich an, das Bit ADLAR (left adjust, linksbündig) im Register ADMUX zu setzen. Das 8Bit-Ergebnis ist dann im Register ADCH.

Bit ADFR: Setzt du das Bit, läuft der ADC im free-running-mode. Der ADC startet dann nach einer Wandlung automatisch die nächste Wandlung, er triggert sich also selber.

Bit ADSC: Setzt du dieses Bit, startet der ADC die Wandlung. Sobald die Wandlung beendet ist, löscht der ADC dieses Bit. Du kannst also in einer Schleife permanent das Bit ADSC abfragen (nennt man pollen), sobald es "0" ist, holst du dir dann das Ergebnis aus den Registern ADCH und ADCL. Alternativ kann man auch den Interrupt aktivieren und in der ISR das ADC-Ergebnis verarbeiten. Am einfachsten ist es, eine single-conversion durchzuführen (Bit ADFR=0), starten mit setzen von ADSC und pollen des Bits, danach auslesen des Ergebnisses und ggf. wieder neu starten durch erneutes setzen von ADSC.

Mit Bascom kenne ich mich leider nicht so gut aus und weiss nicht inwieweit du das verwerten kannst.

Grüße,
Dirk
 
Hi
Danke Dino03 und Dirk... hab schon leichte Schweißtropfen auf der Stirn..... :)
In Assembler hätt ich helfen können, aber BASCOM.... :stupido2:
Gruß oldmax
 
Hallo alle zusammen,

also der link von Dino ist schon sehr hilfreich. Was die einzelnen Bits in den Registern verändern habe ich jetzt begriffen glaube ich.
Was ich auf der Seite aber ein bisschen vermisse ist ein Beispielcode für bascom. Der in dem Code ist nur ein Beispiel mit getadc gemacht. Mit getadc kann ich auch schon arbeiten. Jetzt würde ich gerne versuchen die Auswertung einzeln zu machen.
Ich habe schon in der Hilfe gesucht, da habe ich aber nur den getadc gefunden. Im Internet lande ich ständig bei irgendwelchen touchpannels. Das ist aber auch nicht so richtig hilfreich.
Gibt’s denn irgendwo einen Beispiel Code wo die Register Einzel gesetzt werden und die Auswertung dann auch Einzel geschieht. Also eben nicht einfach mit getadc??

Also fürs erste stelle ich mir das Programm von mir was jetzt geht ohne den getadc Befehl zu programmieren.
Wenn ich aber versuche den Registern ADCSRA oder ADMUX eine wert zuzuweisen bekomme ich schon einen Fehler vom Compiler.
ich denke also dass da etwas mehr dazu gehört als zu schreiben
ADCSRA = &b11101110
Und ADMUX = &b01000001
Und dann in der ISR zu warten bis ADIF =1 ist und dann den Wert aus ADCH zu verwenden.
Vielen dankt
Timo
 
Hallo @ all!

Wenn ich es richtig verstehe, willst Du 2 Analog-Signale mit dem µC messen und verarbeiten.
Allerdings ohne den besagten Bascom-Befehl "Getadc", sondern über direkten Zugriff auf die entsprechenden Register.

Dazu mein Tipp (ohne jetzt Werbung dafür machen zu wollen):
Schau Dir mal die Seite von Roland Walter an, dort erklärt er es sehr gut.
In seinem Buch ist es auch sehr gut erklärt - ich hatte es mir damals mir auch gekauft und nutze es noch heute zum nachlesen...

Bei weiteren Fragen einfach noch einmal melden, dann kann ich Dir ggf. auch ein Stück Code zur Verfügung stellen - muss jetzt wieder weiterarbeiten...


MfG

FreeVee
 

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