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
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
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
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. ...
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
wenn du fragen zu fastavr-basic hast, stell sie. mfg pebisoft
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.
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
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
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
@Andi: Lass dich doch nicht auf dieses Niveau herab, hast du doch nicht nötig... ;-) ...
Stimmt, hast recht, haben wir beide nicht nötig. Nur schade für den Eröffner dieses Threads. MfG Andi
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
@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...
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.
WAS? Nein, kann doch nicht sein! Oder doch...? MfG Andi
57 - sowas... hätt' ich nicht gedacht, schade eigentlich!
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. ...
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
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
@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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.