Hallo!
Da ich mal einen neuen ATMEGA verwenden wollte, also einen ATMega328P,
habe ich anscheinend auch Probleme dazu bekommen. Die STS, LDS-Story und
freischalten der ADCs habe ich mir bereits gut durch gelesen und
trotzdem will der ADC nicht arbeiten. Beim ATMega8 hats ja funktioniert,
nur halt beim ATMega328P nicht.
Nun gehe ich davon aus, dass irgentwo in der ADC-Routine der Hund
begraben liegt. Direktes Ansteuern des TDA6610 mit Test-Programm hat
funktioniert und kann daher einen Hardwarefehler ausschließen und die
Steuerspannungen zu den ADCs kommen auch sauber an.
Im Anhang ist die Assembler-File zu finden und hoffe man kann mir da
weiter helfen.
Schöne Grüße!
ist auch noch nicht koscher.
Du hängst da jetzt in einer Endlosschleife.
der sts gehört da nicht hin. Du fragst nur das Bit im ADCSRA ab, ob es 0
ist. Wenn ja, kannst du die Schleife verlassen.
-> du brauchst nichts ins ADCSRA zurückschreiben
-> du willst den rjmp überspringen, wenn sich das Bit als 0 erweist.
BIst du dir sicher, dass du das hier
1
...
2
incTEMPA
3
4
stsADMUX,TEMPA
5
...
tun willst?
Der vorhergehende Aufruf von sample_adc hat dir TEMPA zerstört.
Dafür speicherst du vom Ergebnis des Wandelvorgangs
1
rcall sample_adc ; ADC Lautstärke
2
sts 0x0060,TEMPB ; Lautstärkewert ins RAM 0x0060
nur die unteren 8 Bit.
Bist du sicher, dass das so gewollt ist? Wenn ADLAR nicht gesetzt ist,
dann kriegst du vom ADC ein 10 Bit Ergebnis.
Und bitte: tu dir selbst einen Gefallen und mach einen Bogen um so Dinge
wie ein direktes reinschreiben con 0x0060 in den Code. Das ist doch auf
lange Sicht viel zu fehleranfällig!
Lass doch den Assembler darüber Buch führen, welche Speicherzellen du
benutzt hast und welche noch frei sind und benutze statt dessen
symbolische Namen im Code!
http://www.mikrocontroller.net/articles/AVR-Tutorial:_SRAM
1
....
2
rcall sample_adc ; ADC Lautstärke
3
sts VolumeLevel,TEMPB
4
....
5
6
lds TEMPA, VolumeLevel
7
mov VOL, TEMPA ; ins Lautstärkeregister verschieben
8
....
9
10
11
12
.DSEG
13
VolumeLevel .BYTE 1
14
BassLevel .BYTE 1
15
HeightLevel .BYTE 1
Siehst du, wie einige der Kommentare überflüssig geworden sind, ganz
einfach dadurch, dass ich dem Byte im SRAM einen Namen gegeben habe?
Dass die Lautstärke, aka 'VolumeLevel' an der Adresse 0x0060 im Speicher
liegt, interessiert mich doch gar nicht. Das ist der Job des Assemblers
darüber Buch zu führen. Mich interessiert nur, das es im SRAM liegt.
Wenn ich die Adresse des Bytes brauche, dann benutze ich 'VolumeLevel'.
Welcher Zahlenwert dahinter steckt, das erledigt der Assembler für mich.
Benutze ich überall den gleichen Namen, dann habe ich automatisch
überall die gleiche Adresse stehen, ohne dass ich mir darüber den Kopf
zerbrechen muss oder höllisch darauf aufpassen müsste überall die
gleiche Zahl zu benutzen und nur ja keinen blöden Tippfehler zu machen.
Programmieren ist schon schwer genug. Du muss ich mir nicht auch noch
absichtlich Prügel zwischen die Beine werfen um nur ja möglichst viele
Stolperfallen aufzubauen.
Danke, das macht es einfacher.
Mal schauen ob es dann geht.
Früher hab ich das mal so gelernt gehabt mit der Direkteingabe, aber
jetzt hab ich wieder was dazu gelernt.
Heißt das jetzt auch, dass ich mir keine Sorgen machen muss, dass nichts
in einem Speicher landet, wo ich später keinen Zugriff mehr habe nach
dem Programmieren?
Bei AVR-Studio kann man bei den Fuses ja den RAM-Bereich justieren,
welcher frei gegeben werden kann. Oder landen diese Eingaben automatisch
in der Minimalebene, welche immer freigegeben ist?
Electronicfox schrieb:> Heißt das jetzt auch, dass ich mir keine Sorgen machen muss, dass nichts> in einem Speicher landet, wo ich später keinen Zugriff mehr habe nach> dem Programmieren?
Allerdings.
Vor allen Dingen hättest du mit deinem Code in den "Extended Register"
Bereich geschrieben. Mit 0x0060 hättest du am Watchdog Control Register
WDTCSR rumgefummelt. Nicht ganz das, was du willst.
> Bei AVR-Studio kann man bei den Fuses ja den RAM-Bereich justieren,> welcher frei gegeben werden kann.
Das hat nicht viel mit dem AVR Studio zu tun, sondern damit, was dein
Controller kann. Und der Mega328P hat frei verfügbares SRAM beginnend ab
der Adresse 0x0100. Liest denn heute keiner mehr Datenblätter? Gerade
für Assemblerprogrammierer gilt doch: Das Datenblatt ist deine Bibel.
> Oder landen diese Eingaben automatisch> in der Minimalebene, welche immer freigegeben ist?
Keine Ahnung wovon du überhaupt sprichst.
Schau dir im Datenblatt zum 328P das Kapitel 7 "AVR Memories" an.
http://www.atmel.com/Images/doc8161.pdf
Aber: Durch das .DSEG befreist du dich davon, die genaue Adresslage zu
kennen. Der Assembler kennt sie, passend zu deinem benutzten Controller.
Und das reicht dann schon.