Na mijn eerste projectje met een AVR (een looplicht) ben ik tot de volgende stap gekomen: een LCD aansturen.

Het is een 1*16 lcd met HD44780 controller.
Ik heb het boek AVR-microcontrollers van Elektuur, daarin staat een voorbeeldprogramma om een 2*20 aan te sturen.
Nu heb ik zo weinig mogelijk proberen overschrijven omdat je anders niet begrijpt wat je doet. Enkel kon ik zelf het systeem niet bedenken om een char uit het program memory te halen en dan naar de LCD te zenden.

In het boek lossen ze dit als volgt op:


ldi teller,0x10	; 16 tekens die op het scherm moeten komen
ldi ZL,LOW(tabel1*2) ; low poainter wijst naar begin tabel
ldi ZH,HIGH(tabel1*2); high pointer wijst naar begin tabel
msg:	lpm; load program memory, byte van tabel in R0
	mov buffer,teken ; zet de inhoud van R0 in buffer
	ldi temp,0x01	 ; 1 in temp
	sts type,temp	; type = data uitvoer
	rcall 	write	; write 8bit (buffer)to lcd
	inc	ZL	; low-pointer met 1 verhogen
	brcc	no_carry ; if nocarry  => jump no_carry
	inc	ZH	; ZH verhogen, want carry set van ZL
no_carry:	dec teller	; verlaag counter
		brne	msg ; zend volgend char tot ccounter 0 is

die byte die ik in het sram schrijf dat is mijn eigen creatie, om 1 write procedure te maken zowel voor data als voor insctructie ( in het boek gebruiken ze hier 2 routines voor..) dus aan de hand van de waarde in het sram weet hij of het een instructie of data is.

nu vanaf brcc no_carry en volgende regels begrijp ik het nietmeer. Kan iemand uitleggen wat er precies gebeurd.

Je hebt te maken met een pointer maar die pointer is te groot voor 1 register en bestaat dus uit een hoog en een laag deel verspreid over 2 registers. Omdat je een tabel wil vullen, vul je de 1e plek en verhoog je de pointer. Maar wat gebeurt er als jij de pointer verhoogt met 1 als die is:
pointer hoog: 0000.0010
pointer laag: 1111.1111
door de pointer laag met 1 te verhogen word de nieuwe waarde
pointer hoog: 0000.0010
pointer laag: 0000.0000
Deze totale waarde van de pointer is NIET 1tje hoger dan wat het daarvoor was. Het is zelfs 255 stappen lager. Dat komt omdat het ZL register namelijk een overflow krijgt, dus hij word te groot en springt weer naar 0. In dat geval word er bij die overgang altijd een carry geset in zijn status register. Die carry moeten we gebruiken om de ZH met 1 te verhogen. Dat word dus met die paar regels gedaan.
brcc is een instructie die kijkt of de carry is gecleared. Is er dus geen carry dan mag het programma gewoon verder gaan, is er wel een carry dan betekent dat dus dat de ZL een overflow heeft gehad en dus dat de ZH met 1 moet worden verhoogt.

oude waarde
pointer hoog: 0000.0010
pointer laag: 1111.1111

als je pointer laag (ZL) met 1 verhoogt krijg je een overflow en word dus de ZH ook met 1 verhoogd

pointer hoog: 0000.0011
pointer laag: 0000.0000

deze totale pointer waarde klopt wel, want dit is 1 hoger dan de oude waarde.

glashelder!
ik begrijp het volledig nu.
Straks mijn lcd eens solderen en dan kan de fun beginnen.

owja op elke uitgang van de AVR staat een weerstand van 470ohm en een led, heeft dit invloed op de timing/werking het lcd scherm? (leds zijn met gemeenschappelijke anode doorverbonden)

Ik denk dat dit niet stoort, maar toch maar eens even checken bij de experts :)

Koen

Oke nu de Simulatie goed loopt heb ik het in mijn avr geprogged.

Nu kan ik volgen via leds welke uitgangen hoog/laag zijn
Heb overal delays geplaatst dat mijn oog het kan volgen natuurlijk :)

Nu wil ik dus de lcd aansturen, maar de Busy Flag blijft constant hoog vanaf ik dus de voeding aanzet. En dan blijft het dus zo hangen.

Nu ik denk dat het eerder iets hardwarematigs is dan software.
Zijn er bepaalde dingen die ik in acht moet nemen bij het aansluiten? ( staat nu op een experimenteerbordje )

Koen