Hallo users, Bastle momentan etwas mit LCD's rum. Klappt soweit gut. Nun habe zurzeit das Problem, das mein LCD an PORTD tadellos funktioniert, sobald ich aber auf das PORTC oder auch PORTB wechsle, bleibt die Anzeige auf dem Dislay aus. Von den Pinnummern her wurde nichts geändert. Den Quellcode ist eine Kopie vom LCD Tutorial (mikrocontroller.net) Möchte das LCD an PORTC oder B betreiben, da ich PD2 /PD 3 brauche für Interrupts. Zitat: "Natürlich kann man die LCD-Ansteuerung auch an einen anderen Port des Mikrocontrollers "verschieben": Wenn das LCD z. B. an Port B angeschlossen ist, dann reicht es, im Programm alle "PORTD" durch "PORTB" und "DDRD" durch "DDRB" zu ersetzen." Genau so gemacht, leider keine Anzeige bei PORTC/B. Und ja kontrastpoti wurde auch schon probiert, leider auch nichts. ADC ist übrigens bei dieser Anwendung( noch) nicht in gebrauch. Woran könnte es (noch) liegen? Kontroller: Atmega8 LCD: AV1624 (http://www.produktinfo.conrad.com/datenblaetter/175000-199999/183342-da-01-ml-LCD_Modul_16x2_Zeichen_de_en.pdf) lukas88
Zeig dein Programm! Da es nicht funktioniert. ALles andere ist nur Kristallkugelmurmeln.
Lukas G. schrieb: > Bastle momentan etwas mit LCD's rum. -------------------------------^------ --> http://www.deppenapostroph.info
Lukas G. schrieb: > Zitat: > > "Natürlich kann man die LCD-Ansteuerung auch an einen anderen Port des > Mikrocontrollers "verschieben": Wenn das LCD z. B. an Port B > angeschlossen ist, dann reicht es, im Programm alle "PORTD" durch > "PORTB" und "DDRD" durch "DDRB" zu ersetzen." Was ist denn das für ein Ansteuercode? Ein ordentlicher Code hat das bereits erledigt und es gibt nur eine einzige Stelle, an der man seine Portbezeichnung einträgt. Wenn der Ansteuercode es verträgt, dann können es unter Umständen auch mehrere sein, weil die Steuerleitungen auf einem anderen Port liegen können. Aber wie auch immer: die Portumstellung wird nicht im Code selber gemacht, indem man im C Code rumfuhrwerkt, sondern an einer einzigen Stelle, der normalerweise ein #define ist. Von einem Code, bei dem das nicht so gemacht ist, sondern ich direkt in den C-Anweisungen die Portbezeichnungen ändern muss, würde ich schon mal grundsätzlich die Finger lassen. > Genau so gemacht, leider keine Anzeige bei PORTC/B. Und ja kontrastpoti > wurde auch schon probiert, leider auch nichts. Wenn das LCD an einem Port funktioniert, dann stimmt auch der Kontrast. Der ändert sich nicht, wenn du an einen anderen Port gehst > Woran könnte es (noch) liegen? Du könntest irgendwo ein PORTB oder ein PINB gegen den entsprechend anderen Portnamen auszutauschen vergessen haben. Du kannst aber auch einen Fehler in der Verkabelung haben. Der Port B ist beim Mega8 ja schon ganz schön verstreut, weil da ja auch die Anschlüsse für einen Quarz drauf sind. Und am Port C gibt es noch die Möglichkeit, dass du AVcc nicht angeschlossen hast.
Schon mal aufs Pinout geschaut? Welche Pins verwendest Du denn? Sind die auf C und D auch nutzbar - bzw. überhaupt da? ATMega8 hat nur eine begrenzte Anzahl von Pins ... oder?
1 | .nolist |
2 | .include "/home/lukas/Dokumente/AVR/includes/m8def.inc" |
3 | .list |
4 | |
5 | ; .def definiert ein Synonym (Namen) für ein µC Register |
6 | .def z = r20 |
7 | .def up = r21 |
8 | .def temp1 = r16 |
9 | .def temp2 = r17 |
10 | .def temp3 = r18 |
11 | .def temp4 = r19 |
12 | |
13 | |
14 | .org 0x0000 |
15 | rjmp conf |
16 | |
17 | .org 0x0009 |
18 | rjmp timer0_overflow |
19 | |
20 | |
21 | |
22 | timer0_overflow: |
23 | |
24 | inc z |
25 | reti |
26 | |
27 | z_zero: |
28 | |
29 | clr z |
30 | ret |
31 | |
32 | |
33 | lcd_number: |
34 | mov temp1,up |
35 | push temp2 ; register sichern, |
36 | ; wird für Zwsichenergebnisse gebraucht |
37 | ldi temp2, '0' |
38 | lcd_number_10: |
39 | subi temp1, 10 ; abzählen wieviele Zehner in |
40 | brcs lcd_number_1 ; der Zahl enthalten sind |
41 | inc temp2 |
42 | rjmp lcd_number_10 |
43 | lcd_number_1: |
44 | push temp1 ; den Rest sichern (http://www.mikrocontroller.net/topic/172026) |
45 | mov temp1,temp2 ; |
46 | rcall lcd_data ; die Zehnerstelle ausgeben |
47 | pop temp1 ; den Rest wiederherstellen |
48 | subi temp1, -10 ; 10 wieder dazuzählen, da die |
49 | ; vorhergehende Schleife 10 zuviel |
50 | ; abgezogen hat |
51 | ; das Subtrahieren von -10 |
52 | ; = Addition von +10 ist ein Trick |
53 | ; da kein addi Befehl existiert |
54 | ldi temp2, '0' ; die übrig gebliebenen Einer |
55 | add temp1, temp2 ; noch ausgeben |
56 | rcall lcd_data |
57 | |
58 | pop temp2 ; Register wieder herstellen |
59 | ret |
60 | |
61 | |
62 | conf: |
63 | |
64 | ldi temp1, LOW(RAMEND) ; LOW-Byte der obersten RAM-Adresse |
65 | out SPL, temp1 |
66 | ldi temp1, HIGH(RAMEND) ; HIGH-Byte der obersten RAM-Adresse |
67 | out SPH, temp1 |
68 | |
69 | |
70 | |
71 | |
72 | ldi temp1,0xFF |
73 | out DDRC,temp1 |
74 | |
75 | |
76 | |
77 | ldi temp1,0b00000101 ; CS00 setzen: Teiler 1 |
78 | out TCCR0, temp1 |
79 | |
80 | ldi temp1, (1<<TOIE0) ; TOIE0: Interrupt bei Timer Overflow |
81 | out TIMSK, temp1 |
82 | |
83 | rcall lcd_init ; Display initialisieren |
84 | rcall lcd_clear ; Display löschen |
85 | sei |
86 | |
87 | main: |
88 | |
89 | clr up |
90 | rcall z_zero |
91 | |
92 | zahlen: |
93 | |
94 | cpi z,15 |
95 | breq up_one |
96 | rjmp zahlen |
97 | |
98 | up_one: |
99 | |
100 | cpi up,50 |
101 | breq main |
102 | inc up |
103 | rcall lcd_clear |
104 | ldi temp1,'S' |
105 | rcall lcd_data |
106 | ldi temp1,':' |
107 | rcall lcd_data |
108 | rcall lcd_number |
109 | rcall z_zero |
110 | rjmp zahlen |
111 | |
112 | |
113 | |
114 | |
115 | |
116 | |
117 | |
118 | |
119 | |
120 | |
121 | |
122 | .include "funk_lcd.asm" |
:
Bearbeitet durch User
1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
2 | ;; LCD-Routinen ;; |
3 | ;; ============ ;; |
4 | ;; (c)andreas-s@web.de ;; |
5 | ;; ;; |
6 | ;; 4bit-Interface ;; |
7 | ;; DB4-DB7: PD0-PD3 ;; |
8 | ;; RS: PD4 ;; |
9 | ;; E: PD5 ;; |
10 | ;; ;; |
11 | ;; Takt: 4 MHz ;; |
12 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
13 | |
14 | |
15 | |
16 | ;sendet ein Datenbyte an das LCD |
17 | lcd_data: |
18 | |
19 | |
20 | push temp2 |
21 | mov temp2, temp1 ; "Sicherungskopie" für |
22 | ; die Übertragung des 2.Nibbles |
23 | swap temp1 ; Vertauschen |
24 | andi temp1, 0b00001111 ; oberes Nibble auf Null setzen |
25 | sbr temp1, 1<<4 ; entspricht 0b00010000 (Anm.1) |
26 | out PORTC, temp1 ; ausgeben |
27 | rcall lcd_enable ; Enable-Routine aufrufen |
28 | ; 2. Nibble, kein swap da es schon |
29 | ; an der richtigen stelle ist |
30 | andi temp2, 0b00001111 ; obere Hälfte auf Null setzen |
31 | sbr temp2, 1<<4 ; entspricht 0b00010000 |
32 | out PORTC, temp2 ; ausgeben |
33 | rcall lcd_enable ; Enable-Routine aufrufen |
34 | rcall delay50us |
35 | pop temp2 ; Delay-Routine aufrufen |
36 | ret ; zurück zum Hauptprogramm |
37 | |
38 | ; sendet einen Befehl an das LCD |
39 | lcd_command: |
40 | push temp2; wie lcd_data, nur RS=0 |
41 | mov temp2, temp1 |
42 | swap temp1 |
43 | andi temp1, 0b00001111 |
44 | out PORTC, temp1 |
45 | rcall lcd_enable |
46 | andi temp2, 0b00001111 |
47 | out PORTC, temp2 |
48 | rcall lcd_enable |
49 | rcall delay50us |
50 | pop temp2 |
51 | ret |
52 | |
53 | ; erzeugt den Enable-Puls |
54 | ; |
55 | ; Bei höherem Takt (>= 8 MHz) kann es notwendig sein, |
56 | ; vor dem Enable High 1-2 Wartetakte (nop) einzufügen. |
57 | ; Siehe dazu http://www.mikrocontroller.net/topic/81974#685882 |
58 | lcd_enable: |
59 | sbi PORTC, 5 ; Enable high |
60 | nop ; mindestens 3 Taktzyklen warten |
61 | nop |
62 | nop |
63 | cbi PORTC, 5 ; Enable wieder low |
64 | ret ; Und wieder zurück |
65 | |
66 | ; Pause nach jeder Übertragung |
67 | delay50us: ; 50µs Pause (bei 4 MHz) |
68 | ldi temp1, $42 |
69 | delay50us_:dec temp1 |
70 | brne delay50us_ |
71 | ret ; wieder zurück |
72 | |
73 | ; Längere Pause für manche Befehle |
74 | delay5ms: ; 5ms Pause (bei 4 MHz) |
75 | ldi temp1, $21 |
76 | WGLOOP0: ldi temp2, $C9 |
77 | WGLOOP1: dec temp2 |
78 | brne WGLOOP1 |
79 | dec temp1 |
80 | brne WGLOOP0 |
81 | ret ; wieder zurück |
82 | |
83 | ; Initialisierung: muss ganz am Anfang des Programms aufgerufen werden |
84 | lcd_init: |
85 | ldi temp3,6 |
86 | powerupwait: |
87 | rcall delay5ms |
88 | dec temp3 |
89 | brne powerupwait |
90 | ldi temp1, 0b00000011 ; muss 3mal hintereinander gesendet |
91 | out PORTC, temp1 ; werden zur Initialisierung |
92 | rcall lcd_enable ; 1 |
93 | rcall delay5ms |
94 | rcall lcd_enable ; 2 |
95 | rcall delay5ms |
96 | rcall lcd_enable ; und 3! |
97 | rcall delay5ms |
98 | ldi temp1, 0b00000010 ; 4bit-Modus einstellen |
99 | out PORTC, temp1 |
100 | out PORTC, temp1 |
101 | rcall lcd_enable |
102 | rcall delay5ms |
103 | ldi temp1, 0b00101000 ; 4Bit / 2 Zeilen / 5x8 |
104 | rcall lcd_command |
105 | ldi temp1, 0b00001100 ; Display ein / Cursor aus / kein Blinken |
106 | rcall lcd_command |
107 | ldi temp1, 0b00000100 ; inkrement / kein Scrollen |
108 | rcall lcd_command |
109 | ret |
110 | |
111 | ; Sendet den Befehl zur Löschung des Displays |
112 | lcd_clear: |
113 | push temp1 |
114 | ldi temp1, 0b00000001 ; Display löschen |
115 | rcall lcd_command |
116 | rcall delay5ms |
117 | pop temp1 |
118 | ret |
119 | |
120 | ; Sendet den Befehl: Cursor Home |
121 | lcd_home: |
122 | ldi temp1, 0b00000010 ; Cursor Home |
123 | rcall lcd_command |
124 | rcall delay5ms |
125 | ret |
:
Bearbeitet durch User
Die Portbezeichnungen scheinen alle angepasst worden zu sein. Kommen wir zur Hardware: Verkabelung stimmt? (Ist mir auch schon passiert, dass ich mich in den Pinbezeichnungen geirrt habe) AVcc ist angeschlossen?
Hallo kbuchegg, Verkabelung sollte stimmen, soweit. Mit AVcc hab schon probiert, sowie ich mich informiert habe sollte dieser Auf GND gezogen werden!? Hat aber nicht wirklich funktioniert. Kann morgen noch ein Bild zur Verkabelung reinstellen. Für heute ist schluss, sollte morgen noch Arbeiten... mfg
Lukas G. schrieb: > Hallo kbuchegg, > > Verkabelung sollte stimmen, soweit. > > Mit AVcc hab schon probiert, sowie ich mich informiert habe sollte > dieser Auf GND gezogen werden!? Äh nein, AVcc ist die Versorgungsspannung dieses Ports. Der hat seine eigene, weil dort der ADC beheimatet ist. d.h. der wird mit 5V verbunden. Und noch ein 100nF Kondensator nach GND
Lukas G. schrieb: > Mit AVcc hab schon probiert, sowie ich mich informiert habe sollte > dieser Auf GND gezogen werden!? Wer hat dir denn diesen Bären aufgebunden? Was meinst du, was im Datenblatt auf S. 6 der Satz
1 | It [AVCC] should be externally connected to VCC, even if the ADC is not used. |
und auf S. 248 die Zeile
1 | Symbol Parameter Condition Min(1) Typ(1) Max(1) Units |
2 | AVCC Analog Supply Voltage VCC - 0.3(2) VCC + 0.3(3) V |
und die Fußnoten 2 und 3
1 | Notes: ... |
2 | 2. Minimum for AVCC is 2.7V. |
3 | 3. Maximum for AVCC is 5.5V. |
bedeuten?
An PortD läufts problemlos aber an Port B und Port C nicht? Sind auch wirklich alles Pins richtig eingestellt? Port D unterscheidet sich von Port B und Port C in der weise, dass hier kein Sonderpin im Spiel ist. Bei Port C hat man z.B. PC6 der der Resetpin ist. Da muss man etwas mehr einstellen als bei anderen, "einfachen", Pins um den als IO nutzen zu können. Bei Port B fällt mir da spontan PB6 und PB7 ein, die Oszilatorpins. Auch hier ist etwas mehr Justage nötig um die als gewöhnliche IOs nutzen zu können. (nutzt du einen Quartz-Oszilator?) Mit Assembler kenne ich mich leider nicht so dolle aus aber schau einfach mal ob du diese Pins auch wirklich richtig initialisiert hast. Bei deinem Beispielcode mit Port C wäre hier die Frage ob du das FUSE-BIT entsprechend gesetzt hast damit PC6 auch als IO-Pin nutzbar ist. Und wie ist deine Clocksource für den Atmega eingestellt? Das hat Einfluss auf die Funktion von PB6 und PB7. Und natürlich prüfen ob man auch wirklich alle Verbinungen richtig verdrahtet hat, also das Pin-out auch wirklich stimmt und man keinen Kabelbruch hat. Insbesondere bei letzterem hab ich mir bei einem LCD auch schon mal nen Wolf gesucht weil es nicht funktionierte (kalte Lötstelle wars bei mir an DB1, hat mich fast nen ganze Tag gekostet diesen Fehler zu finden)
Michael schrieb: > Bei deinem Beispielcode mit Port C wäre hier die Frage ob du das > FUSE-BIT entsprechend gesetzt hast damit PC6 auch als IO-Pin nutzbar > ist. NEIN! Nicht! Einem Anfänger zu empfehlen, sich den Reset Pin wegzufusen ist grob fahrlässig! Ohne High-Volt Programmer kann er den Mega danach wegwerfen. Er braucht 6 Pins zur Ansteuerung. PC0 bis PC3 für die Daten. PC4 und PC5 für die Steuerleitungen. PC6 braucht er nicht.
:
Bearbeitet durch User
Karl H. schrieb: > Einem Anfänger zu empfehlen, sich den Reset Pin wegzufusen ist grob > fahrlässig! Ohne High-Volt Programmer kann er den Mega danach wegwerfen. Oh, nicht falsch verstehen. Ich empfehle ihm das nicht, ich weise nur darauf hin. Er könnte auch weiterhin Port D für das LCD benutzen, immerhin kann jeder Pin als externer Interrupt benutzt werden, nicht nur PD2 und PD3. Aber weil du es grade sagst (das fiel mir gar nicht auf, dass er nur 6 Leitungen fürs LCD benutzt): Was ist denn mit dem RW-Pin des LCDs? Auch sicher auf Low gezogen?
Werd heute abend mal versuchen, das ganze mit dem stk500 aufzubauen. Falls es funktioniert, hab ich was falsches verdratet oder vergessen. Da ich bis jetzt immer mit dem stk500 garbeitet habe , könnte es gut sein dass ich was hardwaremässig nicht ganz richtig konfiguriert habe!
Hi Hab nur mal kurz reingeschaut. Dabei ist mir aufgefallen, das du das Register r20 als Z deklarierst. Klar, kann man machen, aber Z ist in der m8def.inc ein Doppelregister aus r30 und r31, soweit ich es in Erinnerung habe. Mit deiner Deklaration machst du diese zunichte und wenn du später mal die Doppelregister X, Y und Z einsetzen willst, kommen neue interessante Fehler auf dich zu. So, jetzt sehe ich mir den Rest an. Gruß oldmax
Hi Ok, soweit für einen Anfänger erst mal ok, dennoch erlaube mir ein paar Hinweise: Einrücken ist ok, aber setz den Rücksprungbefehl ruhig wieder an den Anfang einer Zeile. So finsest du leichter das Ende einer Sub. Du hast den Timer aktiviert. Gut, aber warum nicht gleich in den Compare-Mode. So kannst du dir eine Zeitbasis schaffen und auf die üblichen Programmbremsen (delays) verzichten. Statt Push und POP sind u.U. Variablen sinnvoll. In einfachen Subroutinen muss man nicht unbedingt die Register retten. Nur wenn du diese in Interruptrotinen aufrufst ist es zwingend notwendig. Der SRAM ist groß genug, um Variablen darin abzulegen. Nebenbei, wenn du dir dann ein kleines Programm schaffst welches dir den Variablenbereich im Block an den PC sendet, kannst du die Inhalte leicht überprüfen. Irgendwann hab ich mal "OpenEye" für diesen Zweck geschrieben und hier veröffentlicht. Ist aber schon ein paar Jahre her. Gruß oldmax
Hab jetzt mal ein paar Bilder gemacht, vielleicht könnt ihr ein Problem erkennen! STK500 hat es übrigens auch nicht funktioniert, scheint also eventuell ein Konfigurations Problem zu sein.
sieht aus wie das Standard 2x16 LCD (Pollin?). müssen da auf der Platine rechts nicht noch A und K angeschlossen werden ?
Ja theoretisch schon, für die Hintergrundbeleuchtung. Benötige ich aber nicht, darum hab ichs ausgelassen!
Jetzt mal abgesehen von den fehlenden Blockkondensatoren kann ich auf den Bildern nichts erkennen, was falsch verdrahtet wäre. Hast du schon mal durchgeklingelt, ob irgendein Kabel zum LCD einen schlechten Kontakt hat? Ich würde jetzt erst mal zum Plan B greifen und mir ein Programm schreiben, welche am PortC 1 Pin auf High setzt und dann nachmessen, ob am LCD auch wirklich an der richtigen Stelle ein High auftaucht. Dann den nächsten Pin. Denn: Da das Programm mit einer Belegung am Port D funktioniert und du soweit ich sehen kann tatsächlich alle Erwähnungen von Port D gegen Port C ausgetauscht hast (DDR natürlich auch), müsste das eigentlich funktionieren. Selbst wenn du mit dem fehlerhaften Anlegen von GND an AVcc den Port C komplett geschossen hast, sollte eigentlich der Port B immer noch funktionieren. Aber sollte ist Konjunktiv. Nachmessen ist immer besser.
Und steck noch 2 100nF Kondensatoren an die Versorgungspins des Mega8. Jeweils einer der Vcc bzw. AVcc mit dem GND Pin auf der jeweiligen Seite verbindet. Kondensatoren dicht an den µC ran. Es wurde schon von den tollsten Effekten berichtet, die dann mit dem Einfügen dieser Blockkondensatoren plötzlich verschwunden sind.
Steck das Ganze doch mal so 10 Reihen weiter ... ich habe mittlerweile 3 Breadboards entsorgt, da die schlicht nicht zuverlässig waren. Ich traue den Dingern nicht mehr - wenn ich Probleme habe stecke ich erstmal um und dann auf ein anderes Breadboard, um Breadboard-Fehler auszuschliessen. Habe mir schon einen Wolf gesucht und dann war es am Ende ein Kontaktproblem im Breadboard.
Schon versucht, leider auch nichts! Paradoxerweise funktioniert das LCD ausschließlich auf Port D. Und durchprobiert/gemessen, ob die Pins strom ein/aus schalten hab ich auch schon. Hab sogar den Atmega ausgewechselt gegen einen neuen! Muss mich wohl langsam damit abfinden, da mir langsam die Ideen ausgehen.... Obwohl es mich natürlich schon wunder nehmen würde wieso..
Lukas G. schrieb: >
1 | > ....... |
2 | > ;sendet ein Datenbyte an das LCD |
3 | > lcd_data: |
4 | > |
5 | > |
6 | > push temp2 |
7 | > mov temp2, temp1 ; "Sicherungskopie" für |
8 | > ....... |
9 | > |
Ähm, wo wird denn das DDRC auf Output geschaltet?
Heinz V. schrieb: > Lukas G. schrieb: >>
1 | >> ....... |
2 | >> ;sendet ein Datenbyte an das LCD |
3 | >> lcd_data: |
4 | >> |
5 | >> |
6 | >> push temp2 |
7 | >> mov temp2, temp1 ; "Sicherungskopie" für |
8 | >> ....... |
9 | >> |
> > Ähm, wo wird denn das DDRC auf Output geschaltet? Im Hauptprogramm. Beitrag "Re: LCD an PORTC ATmega8"
1 | conf: |
2 | |
3 | ldi temp1, LOW(RAMEND) ; LOW-Byte der obersten RAM-Adresse |
4 | out SPL, temp1 |
5 | ldi temp1, HIGH(RAMEND) ; HIGH-Byte der obersten RAM-Adresse |
6 | out SPH, temp1 |
7 | |
8 | |
9 | |
10 | |
11 | ldi temp1,0xFF |
12 | out DDRC,temp1 |
Ja ich weiss. Ist scheisse gemacht und sollte eigentlich mit in die Init Funktion. Aber: das ist nicht das Problem. Leider.
Kast schrieb: > Könnte das helfen? > > Beitrag "ATMega16 und PORTC / JTAG Fuse" Der Mega8 hat kein JTAG
Hier: conf: ldi temp1, LOW(RAMEND) ; LOW-Byte der obersten RAM-Adresse out SPL, temp1 ldi temp1, HIGH(RAMEND) ; HIGH-Byte der obersten RAM-Adresse out SPH, temp1 ldi temp1,0xFF <======= out DDRC,temp1 <======= ldi temp1,0b00000101 ; CS00 setzen: Teiler 1 out TCCR0, temp1 ldi temp1, (1<<TOIE0) ; TOIE0: Interrupt bei Timer Overflow out TIMSK, temp1 rcall lcd_init ; Display initialisieren rcall lcd_clear ; Display löschen sei main:
Kurze Frage: Von euch hat nicht zufälligerweise jemand ein kleines Projekt zur Verfügung, das man 1:1 nachbauen könnte die andere PORTS als D benutzen. Suche morgen selber noch im netz, aber vielleicht hat jemand grad eins zur hand. Ne einfache Uhr oder so... Inklusive schaltplan und Quellcode. Damit ich Etwas testen kann, wo ich weiß ,dass Hard/Software konfiguration schon irgendwo funktioniert haben! mfg
Lukas G. schrieb: > Von euch hat nicht zufälligerweise jemand ein kleines Projekt zur > Verfügung, das man 1:1 nachbauen könnte die andere PORTS als D benutzen. http://www.avrfreaks.net/forum/tutc-lcd-tutorial-1001 In Assembler hat man einfach zuviele Fehlermöglichkeiten.
mmmhh wenn du wirklich auf Portc das so machst Lukas G. schrieb: > ldi temp1,0xFF <======= > out DDRC,temp1 <======= schiest du den Controller ausm Leben und sperrst dich aus denn damit wird PC6 als Ausgang konfiguriert wo bekanntlich ja der Rest zu hause ist... besser wär ldi temp1,$3f In meiner Anfangszeit hatte ich ähnliche Probleme da 1 Port funktionierte und die anderen beiden beim M8 nicht wollten lag an der Verkabelung und der SW. Kann dir empfehlen das du in der LCD Routine alle PortC/B/D durch ein Pseudonym ersetzt wie LCD_Portx/LCD_ddrx und am Anfang der Hauptdatei .equ LCD_portx = PortC .equ LCD_ddrx = DDRC .equ LCD_RS = 4 .equ LCD_E = 5 ersetz. Dadurch hast du nur eine Quelle wo man was ändern müsste und es kann dir nicht passieren das du evtl was in der LCDRoutine ein Portumbenennung vergisst was dir gerade diesen Ärger einhandelt. ;-)
chris schrieb: > mmmhh wenn du wirklich auf Portc das so machst > > Lukas G. schrieb: >> ldi temp1,0xFF <======= >> out DDRC,temp1 <======= > > schiest du den Controller ausm Leben und sperrst dich aus denn damit > wird PC6 als Ausgang konfiguriert wo bekanntlich ja der Rest zu hause > ist... > besser wär > > ldi temp1,$3f besser wäre es zweifellos. Allerdings wär mir das neu, dass man den Reset so ansprechen kann. Wenn der Pin auf seiner Standardeinstellung eingestellt ist und als Reset konfiguriert ist, dann ist er vom Port Register getrennt. Was immer dort auch passiert, es löst keinen Reset aus.
Karl H. schrieb: > Allerdings wär mir das neu, dass man den Reset so ansprechen kann. Wenn > der Pin auf seiner Standardeinstellung eingestellt ist und als Reset > konfiguriert ist, dann ist er vom Port Register getrennt. Das war wie gesagt zu meiner Anfangszeit mit dem M8 und auch noch Ponyprog. Auf jeden Fall hatte ich mich bei 2-3 Testobjekten ausgesperrt gehabt und nur mit nen STK500 über HighvoltageProgrammierung zurückgesetzt bekommen. Seit dem lasse ich das mit einem doppel belegten Pin IO/Reset und lasse ihn als Reset beschaltet ohne Probleme. Wo ist eigentlich der TO hin???
Lukas G. schrieb: > Von euch hat nicht zufälligerweise jemand ein kleines Projekt zur > Verfügung Ich schlage vor, du kümmerst dich um die Grundlagen. Die Ansteuerung eines Pins mit LED dran zum Testen dürfte ein guter Einstieg sein.
Hab mein Problem endlich lösen können, naja fast zumindest. Scheinbar lag es daran, dass ich Funktionen/labels in eine externe Datei verlagert habe und per .include einbunden habe. Hab die Labels in die Haupdatei kopiert, und lief danach ohne Probleme, auch über verschieden Ports hinweg. Offenbar geht irgendwo ein Registerwert verloren, oder wird verfälscht. Ev. Stackpointer?? Wieso genau müsste ich noch einmal den Code intensiv Studieren... Aber nach 1 Woche rumprobieren lass ich das momentan sein. Jetzt kann ich endlich weiter mit meinem Projekt. Danke für eure Zahlreichen Ratschläge und inputs. lukas88
Include bedeutet eine direkte Texteinfügung. Daher ist oft auch die Stelle entscheidend, wo die Inlcude-Anweisung steht. In der Regel ist zu Anfang der Programmdatei die optimale Stelle. Enthält das Include Code, dann darf es aber erst nach der Vektortabelle includiert werden.
Bernd schrieb: > Und woran hat es tatsächlich gelegen Am breadboard :-) ? Der Include war doch sicher schon auch bei der PortD-Variante im Spiel ...
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.