Hoi allen!
Eeuwen geleden dat ik me hier nog eens getoond heb, maar gisteren kwam ik een aantal topics van CO tegen tijdens het googlen naar wat info over wat spulletjes, en begon het te kriebelen om hier terug wat actiever op te worden
Ik breng gelijk ook een vraagje voor jullie mee!
Ik ben de laatste dagen weer wat aan het spelen met 8-bit AVR's, om er wat ervaring mee op te doen (want persoonlijk vind ik dit nog een te groot gat in mijn kennisgebied, dat ik niet kan verantwoorden om in mijn sector actief te zijn...). Ik vond in de kast een LCD'tje zonder opschrift, maar waarvan ik me herinnerde dat ik het ooit op samenkopen.net (een site die ondertussen niet meer bestaat?) gekocht had.
Tijdens het googlen kwam ik deze thread op CO tegen, waarin blijkbaar ook een aantal CO'ers deze display op dezelfde samenkopen actie gekocht hadden! (Overigens is er voor de rest nauwelijks info te vinden op het net over deze display. Enkel nog een paar andere topics op dit forum).
De informatie die ik hier vond was goud waard, en ben meteen aan de slag gegaan met de library van Patrick de Zeester. Deze library gebruikte port B voor de datapins en een aantal pins van port D voor een aantal controlesignalen. Dit was een probleem, want op PB4 en PB5 hangt bij een atmega328p de externe klok... Geen probleem, gewoon even snel de defines omgewisseld: PortB zijn nu de controlesignalen, portD de datapins. Nu werkte het perfect! Zeer mooi en logisch opgebouwde library!
Maarrrr... nu komt het probleem! PD0 en PD1 zijn TX en RX voor U(S)ART. Deze hou ik uiteraard het liefst vrij, zodat ik het LCD ook in combinatie met een seriële verbinden kan gebruiken.
Geen probleem dacht ik, ik splits gewoon de data-byte op, en stuur de eerste 2 bits naar de eerste 2 pins van port C (dan moet er nie geklooid worden met bitshifts), en de laatste 6 blijven gewoon op portD staan, want die stoorden niets. (Alles op portC zetten ging niet omdat portC blijkbaar maar 7 pins heeft ipv. 8)
Het leek me dat dit vrij eenvoudig zou moeten zijn, maar helaas kreeg ik het niet werkend. Ik moet iets fout gedaan hebben, maar kan niet meteen vinden wat. Hopelijk kan een meer ervaren AVR-programmeur me in de juiste weg wijzen?
Dit was de beginsituatie die werkte (na het omwisselen van PortB en PortD):
c code:
#define GLCD_IO_DATA_OUTPUT(data) PORTD = (data)
#define GLCD_IO_DATA_DIR_INPUT() DDRD = 0x00;
#define GLCD_IO_DATA_DIR_OUTPUT() DDRD = 0xFF;
Dit is de aanpassing die ik geprobeerd heb:
c code:
#define GLCD_IO_DATA_OUTPUT(data) \
{PORTD = ((PORTD & 0b00000011) | (data & 0b11111100));\
PORTC = ((PORTC & 0b11111100) | (data & 0b00000011));}
#define GLCD_IO_DATA_DIR_INPUT() {DDRD &= ~(0b11111100); DDRC &= ~(0b00000011); }
#define GLCD_IO_DATA_DIR_OUTPUT() {DDRD |= 0b11111100; DDRC |= 0b00000011;}
Helaas werkte dit niet. Ik dacht... Er hangt momenteel toch nog niets op de overige pins van portD en portC, dus laat ik de volledige byte eens gewoon op beide porten zetten? Dan MOET het toch wel werken?
c code:
#define GLCD_IO_DATA_OUTPUT(data) PORTD = (data); PORTC = (data)
#define GLCD_IO_DATA_DIR_INPUT() DDRD = 0x00; \
DDRC = 0x00
#define GLCD_IO_DATA_DIR_OUTPUT() DDRD = 0xFF; \
DDRC = 0xFF
Maar... Neen. Het werkte nog steeds niet? De LCD geeft geen kik. Wanneer ik het terug op de oorspronkelijke situatie zet werkt alles terug wel naar behoren, dus de LCD werkt wel nog steeds.
Ik vermoed dat ik ofwel gewoon iets fout doe met het herschrijven van de macro's, dat ik ervanuit ga dat iets op een bepaalde manier werkt, terwijl het niet zo is; OF dat er hardwarematig iets is dat ervoor zorgt dat het niet op deze manier kan werken.
Iemand die me in de juiste richting kan wijzen?
Alvast bedankt!
Groeten,
Opifex
ps. Het gaat om deze library: https://sourceforge.net/p/glcdsed1531lib/wiki/Home/ (geschreven door een CO'er die nog steeds hier actief is, zag ik net op zijn profiel )