Forum: Mikrocontroller und Digitale Elektronik Anfängerfragen zum ATMega8 und Assembler


von Jan Purrucker (Gast)


Lesenswert?

Hallo allerseits,

ich habe mich in das AVR Assembler Tutorial eingearbeitet und teste mit
einem ATMega. Leider sind mir jedoch -auch nach Recherche hier- folgende
Fragen offen geblieben:

1. Welcher Unterschied besteht zwischen den R0 - R15, und R16 - R31?

2. Wenn eine externe Datei im Programm eingebunden wird, z.B.
.include "Unterprogramm.asm"
   -> Wo wird dann der Programmtext des Unterprogramms eingebunden bzw.
in den Flash geschrieben?
   -> Ist die Stelle der Einbindungsdirektive im Programm wichtig für
die Programmausführung?

3. Welche Bitmaske wird mit folgenden Befehlen und wo generiert:
   .equ  TWI_RECV_ACK  = (1<<TWIE) | (1<<TWEN) | (1<<TWINT)

oder          CaptBuf:  .byte  FFT_N*2

4. DesWeiteren wäre ich jemanden sehr dankbr, wenn er ein kleines
Beispielprogramm in die Antwort anhängen könnten, mit dem man einen
Analogwert am ADC Port des ATMega8 einlesen kann und dann im 4-Bit
Modus im LCD wieder ausgeben kann. (Ich finde das fehlt noch im
Tutorial)


Mir (und sicher auch anderen Anfängern) wäre für die punktweise
Beantwortung der Fragen sehr geholfen. Vielen Dank schon mal und noch
einen schönen Tag.

Gruß
Jan Purrucker

von Sascha (Gast)


Lesenswert?


von Andi K. (Gast)


Lesenswert?

Hier eine kleine, einfache Routine für ADC:

ADCRead:
  sbis  ADCSRA,ADEN
  rjmp  ADCEnable
  sbic  ADCSRA,ADSC
  ret
  in  r16,ADCL
  in  r17,ADCH
  sts  ADCVal,r16
  sts  ADCVal+1,r17
  sbi  ADCSRA,ADSC
  ret
ADCEnable:
  outi  ADMUX,0b01<<REFS0|0<<ADLAR|0b00000<<MUX0
  outi  ADCSRA,1<<ADEN|1<<ADSC|0b0111<<ADPS0
  ret

.dseg
ADCVal:  .byte 2

Aufruf erfolgt zyklisch mit "rcall ADCRead".
ADCRead kümmert sich selbst um alles, ist der ADC noch nicht Enabled
wird er Enabled, ist der ADC fertig wird der ADC-Wert aus ADCL und ADCH
ausgelesen, in die Variable ADCVal (SRAM) geschrieben, für spätere
verarbeitung, und der nächste ADC-Scan gestartet.
Natürlich ist der ADC-Wert nach der Routine auch in r16:r17.
Momentan wird der ADC auf 1/128 Prescaler eingstellt, was bei 8MHz ca.
4,5KHz entspricht und für triviale Spannungsmessung/überwachung
ausreicht. Kanal 0 (ADC0) ist als Eingang voreingestellt.
Diese beiden Parameter lassen sich bei den Bits "<<MUX0" und
"<<ADPS0" entsprechend anpassen (siehe Datenblatt).
Möchte man mehrere ADC-Kanäle Scannen, kann man das evtl. noch hinein
programmieren.

MfG
Andi

von Andi K. (Gast)


Lesenswert?

Immer diese Macros die keiner hat :D
Sollte für die Allgemeinheit natürlich so aussehen:

ADCRead:
  sbis  ADCSRA,ADEN
  rjmp  ADCEnable
  sbic  ADCSRA,ADSC
  ret
  in  r16,ADCL
  in  r17,ADCH
  sts  ADCVal,r16
  sts  ADCVal+1,r17
  sbi  ADCSRA,ADSC
  ret
ADCEnable:
  ldi r18,0b01<<REFS0|0<<ADLAR|0b00000<<MUX0
  out ADMUX,r18
  ldi r18,1<<ADEN|1<<ADSC|0b0111<<ADPS0
  out ADCSRA,r18
  ret

MfG
Andi

von Hannes L. (hannes)


Angehängte Dateien:

Lesenswert?

1. R0...R15 lassen sich nicht mit Konstanten ansprechen (kein ldi...)
   R16...R31 lassen sich auch mit Konstanten ansprechen (ldi...)

2. Der Text der Includedatei wird dort eingefügt, wo die Direktive
   steht. Es ist also wichtig. Ein Include von Programmcode vor
   der Interrupt-Vektortabelle wäre fatal.

3. 1<<x bedeutet, dass eine 1 um x (Binär-)Stellen nach links
   geschoben wird. Über Menü, Help, Tools, AVR-Assembler (im AVR-
   Studio gelangst du zu weiteren Informationen über Operatoren und
   Direktiven, Hilfe zu ASM-Befehlen gibt es mit F1 während der
   Cursor auf dem "hilfebedürftigen" ASM-Befehl steht.

4. Ein kleines Programm zum fleißigen Analysieren ist im Anhang.

...

von pebisoft (Gast)


Lesenswert?

demo mit fastavr-basic (avr16 mit 8mhz intern)
display an portc0-portc4, rs portc5, en portc4:

$Device= m16
$Stack = 32
$Clock = 8
$Lcd = PORTC.0, RS=PORTC.5, EN=PORTC.4, 16, 2
$Source= On

Dim wert As Word

Enable Interrupts
Start Adc

Do
wert=Adc(0)
WaitMs 100
Lcd wert
Loop

assembler:

.include  "m16def.inc"
;
    .DSEG
wert:    .Byte   2

    .CSEG
.ORG  0

_Reset:
    ldi  yl,Low(RAMEND)
    out  SPL,yl
    ldi  yh,high(RAMEND)
    out  SPL+1,yh
    sbiw  yl,32


    call  LcdIni

;******  USERS BASIC CODE **********************

;-Line--0009----Enable Interrupts--
    sei

;-Line--0010----Start Adc--
    ldi  zl,0x86
    out  ADCSR,zl

;-Line--0012----Do--
L0000:

;-Line--0013----wert=Adc(0)--
    ldi  zl,Low(0)
    in  zh,ADMUX
    andi  zh,0xe0
    Or  zl,zh
    out  ADMUX,zl
    call  _Adc
    sts  wert,zl
    sts  wert+1,zh

;-Line--0014----WaitMs 100--
    ldi  zl,Low(100)
    call  _Wms

;-Line--0015----Lcd wert--
    lds  zl,wert
    lds  zh,wert+1
    call  _W2Str
    call  _LBW

;-Line--0016----Loop--
    rjmp  L0000
L0001:

;****** End OF USER BASIC CODE ****************


;////// LcdInit ///////////////////////////
LcdIni:  in    zl,DDRC
    ori  zl,0x0f
    out  DDRC,zl
    sbi  DDRC,5
    sbi  DDRC,4
    cbi  PORTC,5
    cbi  PORTC,4
    ldi  zl,16
    rcall  _Wms
    ldi  r24,0x03
    rcall  _LOut
    ldi  zl,5
    rcall  _Wms
    rcall  _LEN
    ldi  zl,6
    rcall  _Wus
    rcall  _LEN
    cbi  PORTC,0
    rcall  _LEN
    ldi  r24,0x28
    rcall  _LCtr
    ldi  r24,0x06
    rcall  _LCtr
    ldi  r24,0x0c
    rcall  _LCtr
    ldi  r24,0x01
    rcall  _LCtr
    ldi  zl,0x03
    rcall  _Wms
    ret

_Lch:  sbi    PORTC,5
    rjmp  _LNib
_LCtr:  cbi    PORTC,5
_LNib:  mov    r21,r24
    Swap  r24
    rcall  _LOut
    mov  r24,r21
_LOut:  in    r23,PORTC
    andi  r23,0xf0
    andi  r24,0x0f
    Or  r24,r23
    out  PORTC,r24
    rcall  _LEN
    ret

;////// LcdEN /////////////////////////////
_LEN:  sbi    PORTC,4
    Nop
    Nop
    Nop
    Nop
    cbi  PORTC,4
    push  zl
    ldi  zl,0x04
    rcall  _Wus
    pop  zl
    ret

;////// Lcd Byte & Word ///////////////////
_LBW:  ld    r24,Z+
    tst  r24
    breq  _LBW1
    rcall  _Lch
    rjmp  _LBW
_LBW1:  ret

;////// Adc ///////////////////////////////
_Adc:  sbi    ADCSR,0x06
_Adc1:  sbic  ADCSR,0x06
    rjmp  _Adc1
    in  zl,ADCL
    in  zh,ADCH
    ret

;////// IntToStr //////////////////////////
_B2str:  clr  zh
    clt
    rjmp  _W2st4
_W2str:  clt
    rjmp  _W2st4
_I2str:  clt
    sbrs  zh,0x07
    rjmp  _W2st4
    Com  zl
    Com  zh
    subi  zl,-0x01
    sbci  zh,-0x01
    Set
_W2st4:  push  yl
    push  yh
    clr  r6
    st  -Y,r6
_N2str:  ldi    r21,0x10
    Sub    r22,r22
_N2st1:  lsr    r6
    rol  zl
    rol  zh
    rol  r22
    rol  r6
    cpi  r22,0x0a
    brcs  _N2st2
    sbci  r22,0x0a
    inc  zl
_N2st2:  dec    r21
    brne  _N2st1
    subi  r22,-0x30
    st  -Y,r22
    mov  r22,zl
    Or  r22,zh
    brne  _N2str
_N2st5:  brtc  _N2st3
    ldi  zl,0x2d
    st  -Y,zl
_N2st3:  mov    zl,yl
    mov  zh,yh
    pop  yh
    pop  yl
    ret

;////// _Waitms ///////////////////////////
_Wms:  ldi    r20,0x14
_Wms1:  ldi    r21,0x85
_Wms2:  dec    r21
    brne  _Wms2
    dec    r20
    brne  _Wms1
    dec    zl
    brne  _Wms
    ret

;////// _waitus ///////////////////////////
_wus:  ldi    r22,25
_wus1:  dec    r22
    brne  _wus1
    dec  zl
    brne  _wus
    ret

;System Global Variables: 0  bytes
;User   Global Variables: 2  bytes


kannste gleich mit den asm32avr vom avrstudio compilieren.
mfg pebisoft

von pebisoft (Gast)


Lesenswert?

wenn du fragen zu fastavr-basic hast, stell sie.
mfg pebisoft

von Andi K. (Gast)


Lesenswert?

Na ja, ich hätt da eine!
Wieso macht FastAVR aus dem bißchen so viel Code?

MfG
Andi

PS: Diese Frage muß nicht beantwortet werden.

von Hannes L. (hannes)


Lesenswert?

Und was hat BASIC mit AVR-Assembler-Fragen zu tun???

...

von pebisoft (Gast)


Lesenswert?

andi k.
schau dir mal die lcd-routine in winavr-c von peter fleury.
um ein display anzusprechen brauchst du den code.
er sieht nur so lang aus, weil da kommentarzeilen zwischen sind und
leerzeichen.

mfg pebisoft

von pebisoft (Gast)


Lesenswert?

Und was hat BASIC mit AVR-Assembler-Fragen zu tun???
hannes ganz viel du arsch....
bist wohl auch wieder so ein langweiler der keine arbeit hat.
ein sozialer trittbrettfahrer was.
mfg pebisoft

von Andi K. (Gast)


Lesenswert?

Jetzt halt mal die Luft an!
Das kann doch echt nicht sein, das Du hier auf diese Art vom Thema
abschweift!
Es ging hier ursprünglich um ASM, und zwar NUR ASM. Klar macht Basic
aus Basic-Code ASM-Code aber mit viel drum herum und uneffektiv.
Sicher überlässt Du komplexere Dinge lieber FastAVR für Dich in
ASM-Code umwandeln den Du dann leicht abgeändert oder blind in Deine
ASM-Codes mit einbindest nur weil Du ZU FAUL bist, effektiven ASM-Code
selbst zu erzeugen!

MfG
Andi

von Hannes L. (hannes)


Lesenswert?

@Andi:
Lass dich doch nicht auf dieses Niveau herab, hast du doch nicht
nötig... ;-)

...

von Andi K. (Gast)


Lesenswert?

Stimmt, hast recht, haben wir beide nicht nötig.
Nur schade für den Eröffner dieses Threads.

MfG
Andi

von pebisoft (Gast)


Lesenswert?

ihr beide seid doch schon das untere niveau.
mir ist hier öfters schon aufgefallen das das unterste soziale pack
ohne geld und perspektiven hier die sau rauslässt. auf das soziale sofa
legen und dann hier noch rum tönen, noch nichts im leben erreicht,
vielleicht auch noch arbeitslos und faul rumhängen anstatt anderen
vernünftig zu helfen. es wäre besser wenn ihr hier aus diesem thread
verschwinden würdet. wagt es nur nicht eure unsinnigen sachen in den
anderen forum unterzubringen. verkrümnelt euch und lasst die leute in
ruhe und mit euren scheiss zwischenbemerkungen. vielleicht habt ihr
sogar noch auf staatskosten studiert.
mfg pebisoft

von Hannes L. (hannes)


Lesenswert?

@Peter:
Mit "Niveau" meinte ich weder dein Haus, noch dein Auto, noch deine
Fachkompetenz, sondern nur deinen Umgangston. In unserem Alter (wir
sind etwa gleich alt) sollte man sich etwas anders ausdrücken können.

Gruß...
...HanneS...

von noch einer (Gast)


Lesenswert?

Lasst mal gut sein. Dieser "pebisoft" stänkert auch öfters im
roboternetz-Forum herum. Zu mehr ist dieser Kleingeist wohl nicht
fähig.
Ein Assembler-Listing aus einem Basic-Compilat zu Posten - das sagt
doch schon alles. Keine Ahnung von nix, aber großes Maul. Sieht mir
ganz nach einem 12-jährigen aus, der auch mal mitreden will.

von Hannes L. (hannes)


Lesenswert?

Nix 12, 55...

von Andi (Gast)


Lesenswert?

WAS?
Nein, kann doch nicht sein!
Oder doch...?

MfG
Andi

von AxelR. (Gast)


Lesenswert?

57 - sowas... hätt' ich nicht gedacht, schade eigentlich!

von Hannes L. (hannes)


Lesenswert?

Moin Axel...

Du hast es ja noch genauer getroffen...

Ist aber für mich kein Grund, da mal hinzufahren, da, wo sich Vögel,
Füchse und Bundeswehr die Hand reichen. ;-)

Vielleicht hat der Peter ja einfach nur ein Bier zuviel im Ba(u)ch
gehabt. Soll ja mal vorkommen. Ist auch kein Problem, kann man ja
hinterher wieder in Ordnung bringen.

...

von pebisoft (Gast)


Lesenswert?

ihr solltet aber ruhig mal aus eurem schrebergarten-niveau rauskommen.
wenn man nur im keller am avr rum oxydiert und fast das tageslicht
nicht seht, verpasste ihr zuviel. ich habe den eindruck das ihr nicht
mehr als dieses forum kennt mnit einer art vetternwirschaft und
versucht nun eure paar erlenten fähigkeiten als kunst anzubieten als
wenn es keine andere gäbe. ich habe hier im forum sehr oft gelesen, das
schüler, die eine frage mehrmals gestellt hatten in die ecke blamiert
worden sind von euren mitvettern, mit blöden antworten. so etwas hasse
wie die pest.wenn ihr im leben, wie ihr es gelebt habt noch nichts
vernünftiges erreicht habt , wird es zeit daran zu arbeiten.
mfg pebisoft

von pebisoft (Gast)


Lesenswert?

zum roboternetzforum.de.
dort gibt es genau solche schwachmaten und soziale schnorrer wie hier
auch. wollen ein roboter bauen und betteln um adressen für raubkopien.
und feilschen um einen euro beim platinen kauf.
reden über dinge , die sie garnicht besitzen und freuen sich noch das
sie einen übers ohr gehauen haben.
mfg pebisoft

von Hannes L. (hannes)


Lesenswert?

@Peter Bi...:

Die von dir angesprochenen Dinge mag ich auch nicht.

Wenn ich mit einem Tip oder Hinweis helfen kann, dann tu ich das gerne.
Komplettlösungen gibt es von mir nicht, da ich selten genau die Dinge
realisiert habe, die der Fragesteller realisieren möchte.

In diesem speziellen Fall (Jan seine Fragen) habe ich die ersten Fragen
korrekt beantwortet und dabei auf Quellen weiterer Information verwiesen
(z.B. auf die Holfe zu AVR-Studio, die recht ergiebig ist). Der Frage
nach dem ADC-Wert zum Display bin ich halb ausgewichen, denn ich hatte
einerseits kein fertiges (und erprobtes) Beispiel da, andererseits hat
Jan ja das Tutorial durchgearbeitet, ist also durchaus selbst in der
Lage, das LCD anzusteuern. Ich lieferte lediglich ein Programm, welches
den ADC ausliest (und anderweitig, hier als PWM, auswertet). Sicher ist
damit die Frage nach der Umwandlung des Zahlenwertes in den
ASCII-String noch nicht gelöst, aber das wäre einer der nächsten
Beiträge gewesen. Abgesehen davon, dass es dazu in der Codesammlung
gute Beispiele gibt. Auch ich hatte mal ein halbfertiges Printsystem
für LCD gepostet, allerdings nicht in der Codesammlung, dazu sind meine
Codes noch nicht gut genug.

Also, ich helfe gern, mach aber nicht unbedingt anderer Leute Arbeit
alleine. Wenn es sich um Hausaufgaben handelt, dann unterstütze ich
auch nicht die Faulheit des Schülers. Auch die Codeschnorrer blitzen
bei mir ab, wer seinen Code zusammenschnorrt, kommt eh nicht damit
zurecht. Man muss zwar nicht unbedingt das Rad neu erfinden, aber es
hilft ungemein, wenn man seine Wirkungsweise versteht und
nachvollziehen kann.

Sicher gab es auch schon Situationen, in denen ich spitze Bemerkungen
abgelassen habe (allerdings nicht mit dem Wortschatz der Gosse, das ist
nicht unbedingt mein Niveau). Dies aber nicht gegenüber wissbegierigen
Anfängern, sondern mehr gegenüber sich selbst überschätzenden Leuten,
die riesige Projekte realisieren wollen, ohne sich um die Grundlagen
oder die Naturgesetze zu scheren. Irgendwie erkenne ich meist an den
Fragen, ob sich der Fragesteller schon selbst bemüht hat, die Frage zu
beantworten.

Meine Bemerkung zu BASIC hatte auch einen Hintergrund:
Da kommt Jemand, der sich nicht zu schade für Assembler ist, und stellt
berechtigte Fragen (Fragen, die wir alle einmal hatten). Endlich wieder
mal Einer, der sich selbst Gedanken machen möchte und verstehen möchte,
wie es funktioniert. Und dann stellt ihm jemand 13 BASIC-Zeilen und als
Übersetzung ein riesiges ASM-Listing gegenüber. So nach dem Motto: Wer
wird sich denn diese Arbeit (ASM) machen, wenn man das mit 13
BASIC-Zeilen erschlagen kann. Das muss doch demotivieren. Das kommt
doch auf das Gleiche raus wie: Wozu das Einmaleins lernen, wo es doch
billig Taschenrechner gibt.

...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.