Hi ich habe versucht in den letzten 2wochen das tuturial durchzuarbeiten. Ging soweit auch, aber ich habe dann mir ein 4*20 LCD mit entsprchendem controler wie im T. angegeben. Bei meinen Mega 8 Typen haut es nicht hin aber bei den 2313 typen schon die schaltungen sind angepasst und die programierung auch (include datei), ich möchte aber unbedingt mit den Mega8 typen arbeiten, wer hatte das selbe problem und weiß eine Lösung ? Grüße aus Bremen Andre
hatte ich ja vergessen (das Wetter puhhh) das Problem ist : LCD Bleibt dunkel oder keine anzeige manchmal auch wire Zeichen
benutze einen 4MHZ habe aber auch 2 und 3,556 und 8 MHZ ausprobiert, ich habe mir eine schaltung augebaut wo ich alles austauschen kann. Den internen tackt von 1MHZ habe ich auch ausgeschaltet. Programieren isp geht auch die led steuerung geht auch nur das lcd spinnt und mir gehen die ideen aus. Ich habe auch den assembler code geändert und größere interwalle ausprobiert.....nichts noch ne Idee ?
Ich habe gerade mit dem ozzi eine vergleichsmessung gemacht beim 2313 pd0,pd1,pd3,pd5 1Vss/4Mhz PD2 und PD4 +5V da geht die anzeige beim mega8 sind pd0-5 an 1Vss/Mhz Die Programierung ist bei beiden gleich, Wie kann das angehen ? Bitte um Tipps Grüße Andre
hallo vorweg muss ich sagen ich kenne den mega8 nicht! aber könnte es sein das die port's die du für die lcd ansteuerung brauchst beim mega8 opencollector sind? da bräuchtest du dann nähmlich pullup widerstände. aber wie gesat ich kenne den mega8 und 2313 nicht, ist nur eine idee. tobias
Hi ich habe die LCD routine des funktionsgenratores ausprobiert.... Port D Port B Port B Nichts...... und der Mega8 hat lt.Datasheet interne pullup Widerstände ich habe die routinen aus dem T. benutzt. Wer hat das mit 4*20 Zeichen und den Mega hinbekommen ? bin echt verzweifelt.... Urlaub um und nicht weiter gekommen...
Die internen Pullups des Atmega kann man ein und ausschalten, mal im Datenblatt nachschauen ob sie standartmässig ein oder aus sind, dann müsste man sie vielleicht einschalten. Grüsse
Ich habs schon mal mit nem ATmega8 Probiert bei mir hat es Funktioniert. Vieleicht hast du vergessen die Definitionsdatei umzuändern also von .include "2233def.inc" in die Definitionsdatei .include "m8def.inc" ?? Probiers mal Mfg. Merle
haun bei dir sie ports hin? ich habe mal (mit nem 85..) ähnliche probleme gehabt. da gings nach dem einschalten einmale (falls es ging) danach nie wieder, erst wenn ich aus und wieder eingeschalten habe. es hat ne weile gedauert, bis ich den fehler fand, denn es ging ja ab und zu. und das nur wegen fehler in der portprogrammierung. ciao
hi die ports funzen aber das mit dem stacks habe ich wohl fasch gemacht... so sieht das Programm aus wo ist der fehler ? .include "m8def.inc" ;ggf. anpassen .def temp1 = r16 .def temp2 = r17 .def temp3 = r18 ldi temp1, low(RAMEND) ;Stackpointer initialisieren out SPL, temp1 ldi temp1, high(RAMEND) out sph, temp1 ;Port D = Ausgang out DDRD, temp1 rcall lcd_init ;Display initialisieren rcall lcd_clear ;Display löschen ldi temp1, 'T' ;Zeichen anzeigen rcall lcd_data ldi temp1, 'e' ;Zeichen anzeigen rcall lcd_data ldi temp1, 's' ;Zeichen anzeigen rcall lcd_data ldi temp1, 't' ;Zeichen anzeigen rcall lcd_data loop: rjmp loop .include "lcd-routines.asm" lcd-routtines ist original schonmal Danke für euer nachdenken und die Tipps die ich schon bekommen habe. Grüße Andre`
da steht temp1 (tempeins) und das ist reguister 16 Ist denn mein Programm soweit richtig ? oder habe ich da beim Stack was falsch gemacht ?
dann macht er schon fehler in der copilierung wenn ich das L weg lasse. spl wird wohl richtig sein. Danke Merle nochn Tip? oder jemand anderes ?
Probier mal ob es Funzt wenn du folgenden code vor 1: schreibst Der code: ______________________ swap r16 andi r16, 0b00001111 sbr r16, 0b00010000 out PORTD, r16 sbi PORTD, 5 nop nop nop cbi PORTD, 5 ________________________ und nach cbi PORTD, 5 kommt dann das Programm über dem die 1: steht Probiers mal müsste eigentlich funktionieren. Mfg. Merle
avr studio 4 und ponny Prog und der zweite teil meine assembler sieht so aus : cd_data: mov temp2, temp1 ;"Sicherungskopie" für ;die Übertragung des 2.Nibbles swap temp1 ;Vertauschen andi temp1, 0b00001111 ;oberes Nibble auf Null setzen sbr temp1, 1<<4 ;entspricht 0b00010000 out PORTD, temp1 ;ausgeben rcall lcd_enable ;Enable-Routine aufrufen ;2. Nibble, kein swap da es schon ;an der richtigen stelle ist andi temp2, 0b00001111 ;obere Hälfte auf Null setzen sbr temp2, 1<<4 ;entspricht 0b00010000 out PORTD, temp2 ;ausgeben rcall lcd_enable ;Enable-Routine aufrufen rcall delay50us ;Delay-Routine aufrufen ret ;zurück zum Hauptprogramm ;sendet einen Befehl an das LCD lcd_command: ;wie lcd_data, nur ohne RS zu setzen mov temp2, temp1 swap temp1 andi temp1, 0b00001111 out PORTD, temp1 rcall lcd_enable andi temp2, 0b00001111 out PORTD, temp2 rcall lcd_enable rcall delay50us ret ;erzeugt den Enable-Puls lcd_enable: sbi PORTD, 5 ;Enable high nop ;3 Taktzyklen warten nop nop nop cbi PORTD, 5 ;Enable wieder low ret ;Und wieder zurück ;Pause nach jeder Übertragung delay50us: ;50us Pause ldi temp1, $62 delay50us_:dec temp1 brne delay50us_ ret ;wieder zurück ;Längere Pause für manche Befehle delay5ms: ;5ms Pause ldi temp1, $31 WGLOOP0: ldi temp2, $C9 WGLOOP1: dec temp2 brne WGLOOP1 dec temp1 brne WGLOOP0 ret ;wieder zurück ;Initialisierung: muss ganz am Anfang des Programms aufgerufen werden lcd_init: ldi temp3,50 powerupwait: rcall delay5ms dec temp3 brne powerupwait ldi temp1, 0b00000011 ;muss 3mal hintereinander gesendet out PORTD, temp1 ;werden zur Initialisierung rcall lcd_enable ;1 rcall delay5ms rcall lcd_enable ;2 rcall delay5ms rcall lcd_enable ;und 3! rcall delay5ms ldi temp1, 0b00000010 ;4bit-Modus einstellen out PORTD, temp1 rcall lcd_enable rcall delay5ms ldi temp1, 0b00101000 ;noch was einstellen... rcall lcd_command ldi temp1, 0b00001100 ;...nochwas... rcall lcd_command ldi temp1, 0b00000100 ;endlich fertig rcall lcd_command ret ;Sendet den Befehl zur Löschung des Displays lcd_clear: ldi temp1, 0b00000001 ;Display löschen rcall lcd_command rcall delay5ms ret Biite helft mir ....
Warte mal schreib mal dieses Programm: _______________________________________ swap r16 andi r16, 0b00001111 sbr r16, 0b00010000 out PORTD, r16 sbi PORTD, 5 nop nop nop cbi PORTD, 5 .include "m8def.inc" ;ggf. anpassen .def temp1 = r16 .def temp2 = r17 .def temp3 = r18 ldi temp1, RAMEND ;Stackpointer initialisieren out SPL, temp1 ldi temp1, 0xFF ;Port D = Ausgang out DDRD, temp1 rcall lcd_init ;Display initialisieren rcall lcd_clear ;Display löschen ldi temp1, 'T' ;Zeichen anzeigen rcall lcd_data ldi temp1, 'e' ;Zeichen anzeigen rcall lcd_data ldi temp1, 's' ;Zeichen anzeigen rcall lcd_data ldi temp1, 't' ;Zeichen anzeigen rcall lcd_data loop: rjmp loop ;sendet ein Datenbyte an das LCD lcd_data: mov temp2, temp1 ;"Sicherungskopie" für ;die Übertragung des 2.Nibbles swap temp1 ;Vertauschen andi temp1, 0b00001111 ;oberes Nibble auf Null setzen sbr temp1, 1<<4 ;entspricht 0b00010000 out PORTD, temp1 ;ausgeben rcall lcd_enable ;Enable-Routine aufrufen ;2. Nibble, kein swap da es ;schon ;an der richtigen stelle ist andi temp2, 0b00001111 ;obere Hälfte auf Null setzen sbr temp2, 1<<4 ;entspricht 0b00010000 out PORTD, temp2 ;ausgeben rcall lcd_enable ;Enable-Routine aufrufen rcall delay50us ;Delay-Routine aufrufen ret ;zurück zum Hauptprogramm ;sendet einen Befehl an das LCD lcd_command: ;wie lcd_data, nur ohne RS zu ;setzten mov temp2, temp1 swap temp1 andi temp1, 0b00001111 out PORTD, temp1 rcall lcd_enable andi temp2, 0b00001111 out PORTD, temp2 rcall lcd_enable rcall delay50us ret ;erzeugt den Enable-Puls lcd_enable: sbi PORTD, 5 ;Enable high nop ;3 Taktzyklen warten nop nop cbi PORTD, 5 ;Enable wieder low ret ;Und wieder ;zurück ;Pause nach jeder Übertragung delay50us: ;50us Pause ldi temp1, $42 delay50us_:dec temp1 brne delay50us_ ret ;wieder zurück ;Längere Pause für manche Befehle delay5ms: ;5ms Pause ldi temp1, $21 WGLOOP0: ldi temp2, $C9 WGLOOP1: dec temp2 brne WGLOOP1 dec temp1 brne WGLOOP0 ret ;wieder zurück ;Initialisierung: muss ganz am Anfang des Programms aufgerufen werden lcd_init: ldi temp3,50 powerupwait: rcall delay5ms dec temp3 brne powerupwait ldi temp1, 0b00000011 ;muss 3mal hintereinander ;gesendet out PORTD, temp1 ;werden zur Initialisierung rcall lcd_enable ;1 rcall delay5ms rcall lcd_enable ;2 rcall delay5ms rcall lcd_enable ;und 3! rcall delay5ms ldi temp1, 0b00000010 ;4bit-Modus einstellen out PORTD, temp1 rcall lcd_enable rcall delay5ms ldi temp1, 0b00101000 ;noch was einstellen... rcall lcd_command ldi temp1, 0b00001100 ;...nochwas... rcall lcd_command ldi temp1, 0b00000100 ;endlich fertig rcall lcd_command ret ;Sendet den Befehl zur Löschung des Displays lcd_clear: ldi temp1, 0b00000001 ;Display löschen rcall lcd_command rcall delay5ms ret ______________________________________________ So das müsste jetzt aber funktionieren hoffe ich zumindest. Gruß Merle (der Anfänger (leider)) Aber ich denke wir kriegen das schon hin oder?
Danke Merle aber leider nein das display ist unverändert. ich hatte auch schon das program von dem funktionsgenerator drinnen und es so angeschlossen aber auch da hatte ich keine anzeige. Wenn es nicht mit meine 2313 hinhauen würde, dann würde ich sagen das display ist kaputt, aber da geht es ja. ich habe fast 3 wochen versucht das Problem selber zu lösen aber es mag mich wohl nicht... So werde ich am Montag als Looser in die Schule gehen und versuchen ob meinen Dozent für Microprozezortechnik mehr weiß,aber da lehrnen wir noch aufm 8051 system mit eigenem assembler als Betriebssystem. etwa 10 Jahre alt und ein Eigenbau des Berufsförderungwerkes. ich versuch noch die lösung zu finden aber hoffnung ist sehr gering. Aber Danke an alle die Nachgedacht haben, besonders Merle. Falls nochjemand ne Idee hat nur raus damit Grüße Andre
Leuts, ihr initialisiert den Stack nicht richtig. Merle: Das "L" am "SP" ist schon in Ordnung. Nochmal zu den Grundlagen: Der AVR ist ein 8-Bitter, d.h. jedes Register kann 8 Bit beinhalten. Also kann man mit 8 Bit 256 Bytes adressieren. Deshalb gibts beim Mega-8 ein "SPL" und ein "SPH", weil die Kiste 1K SRAM hat. In diesem speziellen Fall ist das zwar nicht so relevant, weil ihr den SRAM nicht anderweitig nutzt, das kann aber zu einer Zeitbombe werden. Mal ne ganz dumme Idee: Nimm doch mal anstelle Port "D" z.B. Port "B". Ich habe jetzt nicht das ganze Datenblatt des Mega-8 durchgeackert, aber die Ports haben teilweise Zweitfunktionen. Unter Umständen könnte eine solche Zweitfunktion per Default ausgewählt sein - wäre zwar ungewöhnlich, aber man kanns ja mal probieren. Wenns mit einem 2313 funktioniert, muß es mit dem Mega-8 auch tun.
Danke für den tip ich habe aber schon port b und c und d ausprobiert. und den stack habe ich auch versuch zu inizialisieren, siehe oben meine erstes assemblerprogramm . da muß ein Fehler sein.Leider kann ich kein englisch und habe endsprechende schwirigkeiten mit den beschreibungen über den avr und z.B. mit dem stk500 aber das ist noch ne andere geschichte. @thkais wo ist den der Fehler in der inizialisierung? Das ist ne schwere geburt........... bei so vielen usern hier wird doch schon einer das mit dem mega8 hinbekommen haben oder ? Bitte Tips was mach ich mit sph und spl falsch ?
ich hab auch mit ner menge frust experimentiert und verdammt viel rumgemacht ohne erfolg alles klappte auf der kleinen version (2313 war das wohl) aber beim großen (8515 meine ich) gingen nichtmal die grundsätzlichen sachen. das problem ist das das erste was man überhaupt macht der stack sein MUSS also: schön das .include "m8def.inc" ;laden .def temp = r16 ;den Register temp definieren .def temp2 = r17 ;der ordnung halber die anderen register auch .def temp3 = r18 ;denn es ist ja nur für den compiler interessant ; und sofort sich um den stack kümmern ldi temp, LOW(RAMEND) ; LOW-Byte der obersten RAM-Adresse out SPL, temp ldi temp, HIGH(RAMEND); HIGH-Byte der obersten RAM-Adresse out SPH, temp danach kannste mit nen paar jump routinen dir das in avrstudio angucken und überprüfen ob da der stack denn ordnungsgemäß funkzioniert --> das wird mit hoher warscheinlichkeit das einzige problem sein. ich hoffe es klappt: viel erfolg! und melde dich nochmal hier im forum greez henning
hab auch nen mega 8 und bei mir tuts so wie im tutorial. hab aber glaub was entdeckt: ldi temp1, low(RAMEND) ;Stackpointer initialisieren out SPL, temp1 ldi temp1, high(RAMEND) out sph, temp1 ;Port D = Ausgang out DDRD, temp1 rcall lcd_init ;Display initialisiere wo tust du bei out DDRD, temp1 bestimmen was in temp1 ist?? ich meine du schreibst temp1 mit der adresse des stacks voll und schreibst das gleiche dann in DDRD. das stimmt doch ned oder??
@henning Danke so hatte ich das schon eingegeben siehe beitrag 1 über. @Tobias .def temp1 = r16 habe ich genau davor defeniert aber bei dir haut es hin? dann kannste ja mir bitte mal deinen kommpletten quellcode als anhang posten? villeicht finde ich dann ja meinen Fehler, wäre echt nett von Dir. Grüße aus Bremen
im ersten scriptposting fehlt der befehl vor dem komentar tatsächlich, nur später ist er dort auch wirklich ldi temp1, 0xFF ;Port D = Ausgang out DDRD, temp1 ich sag mal ich dachte den hab ihr da ;-) greez henning
@ henning aber ich werde nochmal im avr studio probieren, aufgeben ist ja langweilig ,und ich denke es macht keinen unterschied ob ich r16 als temp oder temp1 defeniere oder ? Grüße
hab des gleiche gemeint wie henning. hat nix mit der definition von temp1 zu tun. ldi temp1, low(RAMEND) ;Stackpointer initialisieren out SPL, temp1 ldi temp1, high(RAMEND) out sph, temp1 >> an der stelle wird temp1 nach DDRD geschrieben. >> aber was ist denn in temp1 drin?? siehe oben = high(RAMEND) ;Port D = Ausgang out DDRD, temp1 rcall lcd_init ;Display initialisiere somit schreibst du high(RAMEND) in temp1 rein. und eigentlich sollt in temp1 dir portdefinition rein.
Danke Tobias und Henning es geht das erste mal jubel grins das war es Super jetzt kann ich endlich mal neu sachen testen und dieses nochmal durcharbeiten.... DANKE DANKE DANKE grüße Andre aus Bremen
nix zu danken :) freut mich wenn ich au mal jemand helfen konnte und ned immer nur fragen muss.
Da bist Du nicht der Erste, dem sowas passiert. Nach solchen Fehlern kann man noch so suchen, man sieht sie meistens nicht... Allerdings ist in einem solchen Fall der Simulator meistens aufschlußreich.
in deinem ersten posting, wenn das dein programm ist, fehlt doch die zuweisung für port "d" als ausgang. ldi temp1, 0xff nicht vorhanden out ddrd,temp1 vorhanden
@Blutiger Anfänger: freut mich, wenn es jetz klappt, ich hab bei meinem projekt immer herumprobiert und wieder 2 tage pause gemacht aber als es dann lief wahren die freudensprünge natürlich verdammt hoch! ich hasse stack fehler. @hardy: das hatten Tobias und ich ja auch schon angemäckelt. greez henning
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.