Hallo zusammen, ich und drei meiner Mitschüler arbeiten momentan in der Schule an einem Projekt. Für dieses Projekt haben wir von Ribu ein 7 Zoll Touch-Grafikdisplay gekauft. Meine Aufgabe ist es, das Display mit dem AtXmega256a3 anzusteuern. Bisher haben wir uns in der Schule nur mit einem Atmega16 beschäftigt. Mitlerweile habe ich ein Programm geschrieben, das meiner Meinung nach funktionieren sollte. Die Programmierung erfolgt über den AVR MK2. Mit dem Reset Pin wird das Display gestartet, das funktioniert. Jedoch sollte kurz darauf ein Startbyte über den txd Pin gesendet werden, das macht es aber nicht. Vielleicht könnt ihr mir da weiterhelfen. Gruß Andi Hier der Programmcode: #include <stdio.h> #include <avr/io.h> #include <avr/interrupt.h> #include <avr/delay.h> #include <avr/../string.h> #include <avr/../stdlib.h> #include <AVR/signal.h> #define F_CPU 32000000 unsigned char i; unsigned char a = 1; void init() { PORTD.DIRSET = 0b11110111; //Ein-/Ausgänge definieren USARTD0.BAUDCTRLA = 0b00001100; USARTD0.BAUDCTRLB = 0b01000000; //Baudrate 9600 USARTD0.CTRLA = 0b00000000; USARTD0.CTRLB = 0b00001000; //Transmitter Enable USARTD0.CTRLC = 0b00000011; //Character Size 8Bit } int main(void) { init(); char Ausgabe[11] = {0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x7F, 0xFF, 0xFF}; while(1) { if (a == 1) { _delay_ms(4000); PORTD_OUTSET |= 0x02; //Reset _delay_ms(5000); USARTD0_DATA = 0x55; //Startbyte _delay_ms(3000); USARTD0_DATA = 0x45; //Clear Display _delay_ms(1000); a = 0; } for (i = 0; i < 11; i++) { USARTD0_DATA = Ausgabe[i]; _delay_ms(20); } } }
Hallo, kann es wohl sein, das _delay_ms(5000); bei 32MHz nicht mehr funktioniert?! Da gibts doch immer gewisse Einschränkungen zwischen maximaler Zeit und Taktfrequenz. Nimm mal eine Schleife in der du ein delay_ms(10) nimmst. Sascha
:
Bearbeitet durch User
Hallo, so ist es richtig: PORTD.DIRSET = 0b00001000; //Ein-/Ausgänge definieren dieser Code ist besser zu lesen. PORTD.DIRSET = PIN3_bm; // Ausgang PORTD.DIRCLR = PIN2_bm; // Eingang sonst funktioniert dein Code einwandfrei. Solltest du mehrere Ports von PORTD verwenden, musst du natürlich den Code noch verändern PORTD.DIRSET = 0b00001000; //jetzt nur für den USART Gruß G.G.
Hallo, danke erstmal für die Antwort. Die delay´s habe ich jetzt kleiner gemacht und in eine Schleife verpackt. Leider funkioniert es trotzdem nicht. Das mit den Ein- und Ausgängen versteh ich aber nicht. Mir wurde beigebracht, dass 0 Eingang und 1 Ausgang ist, also wäre PORTD.DIRSET = 0b00001000; genau falsch rum. So wäre nämlich der rxd Pin Ausgang und alle anderen Eingang. Liege ich da falsch? Gruß Andi
Hi >So wäre nämlich der rxd Pin Ausgang und >alle anderen Eingang. Liege ich da falsch? Du liegst auf jeden Fall falsch wenn du meinst an den TXD-/RXD-Pins herumfummeln zu müssen. Das Setzen von RXD und/oder TXD in CTRLB überschreibt die normalen Pinfunktionen. Da kannst du das Direction-Register setzen wie du willst. MfG Spess
Andreas Stadelmann schrieb: > Hallo, > > danke erstmal für die Antwort. > Die delay´s habe ich jetzt kleiner gemacht und in eine Schleife > verpackt. Leider funkioniert es trotzdem nicht. hm? > Das mit den Ein- und Ausgängen versteh ich aber nicht. Mir wurde > beigebracht, dass 0 Eingang und 1 Ausgang ist, so ist es > also wäre PORTD.DIRSET = > 0b00001000; genau falsch rum. nein bei den Xmegea hast du jeweils 4 Zugriffsmöglichkeiten auf jedes Portregister! .DIR der übergebene Wert wird in das Register übernommen (wie bei den 'alten' AVR's); 1=OUTPUT, 0=INPUT .DIRSET jedes 1-Bit wird im Portregister gesetzt, 0-Bits bewirken nichts .DIRCLR jedes 1-Bit wird im Portregister gelöscht, 0-Bits bewirken nichts .DIRTGL jedes 1-Bit wird im Portregister invertiert, 0-Bits bewirken nichts mit PORTD.DIRSET = 0b00001000 wird PORTD.DIR_Bit 3 auf 1 gesetzt, alle anderen Bits bleiben unverändert. Sascha
:
Bearbeitet durch User
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.