Hallo liebe Profis,
nun sitze ich seit Tagen an einem miniProjekt um Assembler zu lernen und
genauer den Umgang mit Ein-/Ausgängen und dem ADC als Eingang.
Anbei sende ich den (zusammengebastelten) Quellcode.
Mein Problem:
Entweder bekomme ich keine Werte vom ADC in den r16/r17 oder dieses wird
nicht sinnvoll ausgewertet.
Was passieren soll sollte klar sein:
Die LEDs (Grün Gelb Rot) sollen je nach stellung des Poti (an
Port(Pin C0) aufleuchten.
Was tatsächlich passiert:
Das System startet und sofort ist Grün an, nach 1Sek (die eingestellte
wait-time) wechselt es auf Rot und bleibt dort.
Umabhängig von Eingang C0.
Ja, ich bin vollkommen neu in ASM und habe bisher alles in VB oder C
geschrieben. Dort sind mir alle Vorgänge klar, jedoch ist in ASM alles
mit Registern und Co Neuland für mich.
Die Suche (google und hier) habe ich nun schon mehrfach genutzt und bin
so auch zu meinem aktuellen SourceCode gekommen.
Wenn jemand bereit ist mir genauer zu erklären was ich falsch mache,
wäre ich sehr sehr dankbar.
Bitte kommt mir nicht mit "Nutz die Suche" oder "Das findet man
überall".
Wer Links hat, einfach Posten und über seine maßlose Überlegenheit
freuen ;)
Besten Dank,
DerKatze =)
DerKatze schrieb:> Was passieren soll sollte klar sein:> Die LEDs (Grün Gelb Rot) sollen je nach stellung des Poti (an> Port(Pin C0) aufleuchten.
Dann schmeiss doch mal alles Andere aus dem Code erst mal raus ...
Gruß
Jobst
DerKatze schrieb:> Ja, ich bin vollkommen neu in ASM und habe bisher alles in VB oder C> geschrieben. Dort sind mir alle Vorgänge klar, jedoch ist in ASM alles> mit Registern und Co Neuland für mich.
Und warum willst Du dann unbedingt auf Assembler umsteigen?
C auf nem AVR ist nicht soo unterschiedlich.
Man hat kein OS und 1000 Tasks sondern nur eine Mainloop und man sollte
nicht planlos mit Variablen um sich schmeißen, sondern überlegen, was
man wirklich speichern muß. Und natürlich immer den kleinst möglichen
Typ nehmen (uint8_t reicht oft).
Und Du solltest Dir erstmal eine Debugausgabe machen, z.B. über RS-232
auf den PC. Nur mit ner LED ist sehr mühsam.
In C sähe das so aus:
1
#define STX_PORT PORTB
2
#define STX_PIN 0
3
#define BAUD 9600
4
5
voidsputchar(uint8_tc)
6
{
7
c=~c;
8
STX_PORT&=~(1<<STX_BIT);// start bit
9
for(uint8_ti=10;i;i--){// 10 bits
10
_delay_us(1e6/BAUD);// bit duration
11
if(c&1)
12
STX_PORT&=~(1<<STX_BIT);// data bit 0
13
else
14
STX_PORT|=1<<STX_BIT;// data bit 1 or stop bit
15
c>>=1;
16
}
17
}
Dann kannst Du Dir erstmal den ADC-Wert als Zahl ausgeben lassen.
Hey xD xD...
ich muss mich entschuldigen xD
ich habe leider die völlig falsche Datei raufgeladen :(((
hier ist die Richtie =)
Trotzdem an alle 'Vielen Vielen Dank'!!!!
Eure Katz'
Hi
Was soll '.include "AVR.H"? In Assembler benutzt man die m8def.inc. Und
auch die Expessions vom Assembler, wie high, low ... .
>ldi r16,128 ;Vorteiler = ganz wichtig
Aber falsch. Sieh dir im Datenblatt an, wie das in ADCSRA eingestellt
wird.
MfG Spess
Hi
> ldi r16,0 ;hier kann auch direkt die 0 o.a. eingegeben werden> out ADMUX,r16 ;Kanal auswählen
Und was ist an AREF?
>;Sollten nur 8 Bit = 256 Schritte notwendig sein, dann wie folgt:> ror r17 ;xxxxxxxN c=N> ror r16 ;Nnnnnnnn c=n> ror r17 ;xxxxxxxx c=N> ror r16 ;NNnnnnnn c=n
Kannst du dir sparen. Einfach ADLAR in ADMUX setzen und ADCH auslesen.
MfG Spess
Hey =)
Danke schonmal!!!
Also ..
ich habe jetzt die 'm8def.inc' aktiviert und nun bringt das Programm
folgenden Fehler:
Hinweis: Es wird die im Quelltext angegebene Sprache verwendet:
Assembler
Hinweis: Es wurde folgender Dialekt ermittelt: atmel
Fehler: AVR Studio ist nicht installiert.
Verwenden Sie den GNU-Assembler oder installieren Sie AVR Studio.
die neue Datei habe ich (wieder als .txt da es nur als .s gespreichert
wird / Sry dafür) angehängt und auch das DB des IC. (Andere wurden als
.asm gespeichert; Versteh einer das Programm o,O)
Leider habe ich wirklich NULL Ahnung wie das mit den Registern geht und
wie man diesen ADC überhaupt in Gang bekommt.
Wie schon gesagt, den Code habe ich zusammengebastelt und das aus vielen
Quellen. Einfach (wie bei Google) Auf-Gut-Glück.
Wenn mir das jmd näher erläutern kann, bin ich extrem glücklich =)
Anbei: Eine super Sache, dieses Forum!!!
Hi
>Verwenden Sie den GNU-Assembler oder installieren Sie AVR Studio.
Ich war von letzterem ausgegangen. Wenn du einen anderen Assembler
benutzt musst du natürlich die passenden Dateien verwenden.
>Wie schon gesagt, den Code habe ich zusammengebastelt und das aus vielen>Quellen. Einfach (wie bei Google) Auf-Gut-Glück.
Lass mal das Gurgeln. Als erstes lies das Datenblatt, lies das
Datenblatt, lies das Datenblatt, ... .
>Leider habe ich wirklich NULL Ahnung wie das mit den Registern geht und>wie man diesen ADC überhaupt in Gang bekommt.
Dann lies dir das
http://www.mikrocontroller.net/articles/AVR-Tutorial:_ADC
mal durch.
MfG Spess
sooo...
nochmals besten Dank.. vor allem an Spess =)
Ich habe mir deinen Link mal durchgelesen und das mit Verstand, danach
war es soooo einfach xD .. 2min geschrieben schon lief alles perfekt =)
Anbei sende ich noch einmal den Code.
Geschrieben in myAVR Workpad plus DEMO (eine Software mit extremen
Fehlern).
Ich habe auch Atmel Studio inzwischen, blicke da aber garnichts =(
Also dann, GUTE NACHT
Eure Katz'
Hi
>Ich habe auch Atmel Studio inzwischen, blicke da aber garnichts =(
Für Assemblerprogrammierung ist das Atmel Studio unnötig. Da reicht das
AVR Studio 4.19 vollkommen.
>Anbei sende ich noch einmal den Code.> ldi r16,0b01100000 ;int. Ref 8-Bit only Kanal C0
Mit
[avrasm]
ldi r16,1<<REFS0|1<<ADLAR
[avrasm]
weiß man gleich, was gemeint ist.
>mainloop: wdr
Hast du den Watchdog laufen? Wenn nicht ist das 'wdr' unnötig.
> ;ADC Teil> sbi ADCSRA,ADSC ;AD Wandlung starten
Im Free Running Mode muss der ADC einmal mit ADSC gestartet werden.
Also das Ganze vor mainloop
> nop> nop
Wozu? Für eine Wandlung braucht der ADC bei deinem Prescaler 13*128
Controllertakte. Was sollen da die zwei nops? Um das Ende einer Wandlung
festzustellen kann man ADIF in ADCSRA auswerten oder gleich den ADC
Complete-Interrupt benutzen.
> in r17,ADCL ;Low-Byte unbedingt zuerst> in r16,ADCH ;High-Byte mit Daten in r16
Bei gesetztem ADLAR reicht es ADCH auszulesen.
> cpi r16,240> brsh all ;r16 >= 240
Kannst du auch gleich durch den Code von 'all' ersetzen.
MfG Spess