Hallo alle zusammen, ich sitzen gerade an einem Projekt mit einem atmega16 und einer selbstentwickelten Platine. Fertig geätzt und somit nicht mehr veränderbar. Also mein Problem besteht darin, dass ich eine Routine zum ansteuern des Display aus einem Buch entnommen hab. Dort werden die Pins des PortD benutzt, bis auf pin 1 und 2. Pin2 hab ich beim Entwickeln der Platine für die Hintergrund-Beleuchtung benutzt, welche dann im laufenden Programm bei bedarf ein und ausgeschaltet wird. Allerdings funktioniert das nicht, da die Routine scheinbar den PIN2 immer bein Aktualisieren des Display ausschaltet. Ich hab den Code mal angehängt. Vielleicht kann mir da ja jemand helfen, wie ich das ändern kann. Bin noch recht grün hinter den Ohren, was da Programmieren von µC angeht. Also bitte Nachsicht. // LCD Output for HD44780 compatible displays // Pinning adapted to set interrupt pins free // Target: ATMEGA8 #include "BitUtilities.h" // LCD control cmmands #define LCD_CLEAR 0x01 /*Clear display: 0b 0000 0001 */ #define LCD_HOME 0x02 /*Cursor home: 0b 0000 0010 */ #define LCD_ON 0x0C /*Cursor invisible: 0b 0000 1100 */ #define LCD_OFF 0x08 /*Display off: 0b 0000 1000 */ #define POS_01 0x80 /*Line 1 - Column 0 0b 1000 0000 */ #define POS_02 0xC0 /*Line 2 - Column 0 0b 1100 0000 */ // definitions of port pins #define LCDPORT PORTD #define LCDDDR DDRD #define LCD_PIN_RS 0 #define LCD_PIN_E 3 #define LCD_PIN_D4 4 #define LCD_PIN_D5 5 #define LCD_PIN_D6 6 #define LCD_PIN_D7 7 #define COMMAND 0 #define DATA 1 void toggle_enable_pin(void) { sbi(LCDPORT, LCD_PIN_E); cbi(LCDPORT, LCD_PIN_E); } void lcd_send(unsigned char type, unsigned char c) { unsigned char sic_c; // backup for c // send high nibble sic_c = c; // save original c sic_c &= ~0x0f; // set bit 0-3 == 0 if (type==DATA) sic_c |= (1<<LCD_PIN_RS); // data: RS = 1 LCDPORT = sic_c; toggle_enable_pin(); // send high nibble // send low nibble sic_c = c; // save original c sic_c = sic_c<<4; // exchange nibbles sic_c &= ~0x0f; // set bit 0-3 == 0 if (type==DATA) sic_c |= (1<<LCD_PIN_RS); // data: RS = 1 LCDPORT = sic_c; toggle_enable_pin(); // send low nibble _delay_ms(5); // Wait for LCD controller } // set cursor to line x and column y void lcd_set_cursor(uint8_t line, uint8_t col) { uint8_t i; switch (line) { case 1: i=0x80+0x00+col; break; // 1. line case 2: i=0x80+0x40+col; break; // 2. line default: return; // invalid line } lcd_send(COMMAND, i); } // write string to LCD void lcd_write(char *data) { while(*data) {lcd_send(DATA, *data); data++;} } // Initializing LCD controller - see data sheet for details void lcd_init() { /* Set Port to Output */ LCDPORT = 0x00; LCDDDR = 0xFF; _delay_ms(50); // Wait for LCD /* 4-bit Modus config */ sbi(LCDPORT, LCD_PIN_D5); cbi(LCDPORT, LCD_PIN_D4); /* 4-Bit Modus start */ sbi(PORTD, LCD_PIN_E); cbi(PORTD, LCD_PIN_E); _delay_ms(5); /* 2 Lines, 4-Bit Mode */ lcd_send(COMMAND, 0x28); lcd_send(COMMAND, LCD_OFF); lcd_send(COMMAND, LCD_CLEAR); lcd_send(COMMAND, 0x06); lcd_send(COMMAND, LCD_ON); } Vielen Dank schon mal im Voraus!!! Gruß Patrick
Patrick schrieb: > Hallo alle zusammen, > ich sitzen gerade an einem Projekt mit einem atmega16 und einer > selbstentwickelten Platine. Fertig geätzt und somit nicht mehr > veränderbar. Hast du eine Ahnung was mit einem kleinen scharfen Messer und ein wenig Fädeldraht auf einer 'fertig geätzten Platine' alles möglich ist :-) > Allerdings funktioniert das nicht, da die Routine scheinbar den PIN2 > immer bein Aktualisieren des Display ausschaltet. > > Ich hab den Code mal angehängt. Vielleicht kann mir da ja jemand helfen, > wie ich das ändern kann. Bin noch recht grün hinter den Ohren, was da > Programmieren von µC angeht. Also bitte Nachsicht. Na dann musst du deinen Code durchsuchen, wo du auf den Port als ganzes zugreifst, wenn du eigentlich Einzelpin Zugriffe haben solltest - ohne Rücksicht auf Verluste. Dazu wärs natürlich gut, wenn dein Code ein wenig vernünftig formatiert wäre, dann würde man sich keinen Wolf suchen. Und ich seh jetzt ehrlich gesagt nicht ein, warum ich da deine Arbeit machen soll. Wonach du Ausschau halten musst, weißt du ja jetzt. Viel Spass beim Suchen. (Du könntest natürlich auch erst einmal hergehen und deinen Code vernünftig formatieren. Dann würde auch dir die Suche leichter fallen) Und PS: so viele Stellen gibt es ja nicht, an denen auf den Port zugegriffen wird.
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.