Jag har kopplat ihop min atmega8 med en HD44780-kompatibel display och lyckats initiera den och skicka ut bokstäver. Jag vill nu införa en funktion som loopas tills dess att busy-flaggan släcks, istället för att hålla på med delays. Problemet är att när jag sätter RS=0, och RW=1 och sedan EN=1 för att skicka instruktionen så fastnar jag i nån sorts loop. Vet inte exakt vad som händer, men jag har en diod inkopplad på PB1 och den börjar blinka rätt så fort när jag sätter just EN=1 (ingen kod efter den raden exekveras). Någon som har en aning om vad detta kan bero på?
#define SETEN PORTB |= (1<<4)
#define CLREN PORTB &= ~(1<<4)
#define SETRS PORTB |= (1<<2)
#define CLRRS PORTB &= ~(1<<2)
#define SETRW PORTB |= (1<<3)
#define CLRRW PORTB &= ~(1<<3)
void waitLCD()
{
DDRD = 0x00; // Set pins for input, going to read busy flag
PORTD = 0xFF; // All pins high, enable pull-up
CLREN; // Clear Enable bit
CLRRS; // Clear RS bit (instruction being sent)
SETRW; // Set Read (set high)
SETEN; // Carry out command
return;
// klippt bort koden här under, den utförs ändå inte. Lekte med att flytta return; tidigare i koden för att hitta vart det blev fel.
}
Planen är att vänta tills LCD'n är klar (dvs läsa busy flaggan) efter varje kommando. Är det en dålig idé?
Enable sätter jag ju låg, se tredje kommandot (CLREN). Sätta enable låg igen innan jag läser av spelar nog ingen roll just nu i alla fall, eftersom den aldrig kommer förbi den raden som sätter enable hög.
EDIT:
Det är en läsning jag ska göra, och enligt databladet ska då R/W sättas till 1 (hög). Och med skicka instruktionen menar jag att jag sätter enable till hög för att pulsa. Lite klumpigt uttryckt kanske
> Planen är att vänta tills LCD'n är klar (dvs läsa busy flaggan) efter varje kommando. Är det en dålig idé?
Det är bättre/effektivare att vänta på busy flaggen *före* varje kommando.
Då behöver du inte vänta i onödan...
Enu enklare är att struta i busy flaggen och bara ha en liten delay mellan varje kommando.
Det sparar även en pinne (R/W) på porocessorn. Det är ju väldigt sällan som man behöver
uppdatera en LCD så ofta att timingen blir ett reelt problem. Kollade ett HD44780 datablad
och allt går på 40 us utom display clear, men när man gör det kan man vänta lite längre.
Smart där med att kolla busy innan kommandona istället. Får införa den rutinen istället
Nu är det ju precis som v-g säger att jag experimenterar/leker och vill gärna få det att fungera. Interrupt/WGT/A/D/komparatorer har jag inte rört alls. Är det någon jag bör ändra på i början av koden?
Jag skickar ju CLREN/SETEN i andra delar av initieringen utan några problem. Det är ju bara när RW-biten är satt till hög som det blir problem.
Jag kan bara PIC och därav de "förPIC:ade" namnen vet inte vad registrena heter på atmega8 men det vet ju du som sitter med manualen
Om man då tar som exempel en port på PIC så är standardfel 1A att man inte stänger av komparatorerna som finnes på denna port och därmed fungerar det inte.
Om dettta finns i fuses eller var det finns/heter har jag ingen aning om.
WDT är watchdogtimer som är en timer som när den tidar ut (dvs inte resettas som den ska) får µcn att gå i reboot.
> Smart där med att kolla busy innan kommandona istället.
Japp, det är bättre att låta koden göra annat medans LCD jobbar.
I många fall kanske den redan är klar innan du vill sända nästa
kommando, och då hade du ju väntat helt i onödan med din lösning.
Det är samma sak med t.ex UART, de är effektivare att kolla om sänd-
bufferten är tom *innan* man sänder istället för efter. Om man bara
sänder ett tecken då och då så väntar man ju helt i onödan annars.
Såvitt jag förstår så gör du rätt mot LCD modulen i alla fall.
Själva läsningen i AVR'en är ju inte med så det vet vi inget om.
Om AVr'en har analoga funktioner på pinnarna på det sätt
som v-g nämner, så kan det kanske vara en felkälla.
>> Låter som det skulle vara kortis nånstans. Har du provat att koppla bort EN för att se om koden då fortsätter exekveras?
Du menar fysiskt koppla bort den på kopplingsdäcket? Har inte provat. Men som sagt, om jag kommenterar bort snutten som sätter R/W till 1 så exekveras programmet utan några problem.
Nu har jag provat en sak med tanke på det du sa om kortslutning. Till PB3 är även MOSI kopplad som går mot min programmerare. Om jag plockade bort sladden som går till programmeraren (till PB3) så hänger den sig inte längre. Måste jag plocka bort den varje gång eller går det att komma runt?
Det beror ju helt på "programmeraren"...
En vettig prorammerare borde koppla bort sig själv efter programmeringen.
Men vad är problemet ? Antingen koppla bort programmeraren (om du måste
det) eller använd en annan pinne än PB3.
Det är en hemmabyggd programmerare så jag får nog skylla på mig själv här helt enkelt. Får fixa nån switch som kopplar bort den. Tack så mycket för hjälpen allihopa!