Jag har precis börjat roa mig med avr programmering. Har skrivit mina första program idag på en atmega8. Har gjort rinnande ljus och en tärning som fungerade bra. Tärningen är i en evig loop och slumpar fram nya värden var tredje sekund. Jag skulle vilja koppla en brytare som kastar tärningen istället. Jag tänkte vänta någon dag med att lära mig avbrott så jag tänkte läsa av porten som brytaren sitter kopplad till kontinuerligt. Jag lyckas tyvärr inte läsa från inporten så tärningen startar inte. Har surfat runt på nätet i nån timme men har inte lyckats hitta ngt svar. Koden jag skrivit ser ut enl följande:
Kod: Markera allt
#include<avr/io.h>
#include <util/delay.h>
#include <stdlib.h>
void dice();
int main()
{
DDRD=0x7f; //D0-D6-utportar
PORTD=0x80;//etta till D7(pullup på?)
while(1)
{
int p =PIND;//läs pin ?
p=p&0x80;//maska ut bit 7
if(p=0x80)
{
dice(); //kasta tärning
_delay_ms(3000);
// PORTD=0;
}
}
return 0;
}
void dice()
{
char d[7]={0x08,0x22,0x49,0x63,0x6B,0x77};//kodning för ögonen på tärningen
int rnd=rand()%6;
PORTD=d[rnd];
}
Tärningen består av 7 LED PortD0-D6. Till PortD7 är en strömbrytare kopplad till vad som är tänkt att vara en ingång. Men det fungerar inte!
Är osäker på flera saker:
Om man skriver en etta till inporten, skall brytaren då kopplas mellan porten och jord? Och om en nolla är skriven skall brytaren då kopplas till logisk etta?
Hur ser syntaxen ut för att läsa ett värde från inporten? int n = PIND eller int n = PIND7 verkar inte funka. I Databladet för atmega8 finns ett exempel som jag inte förstår, de sätter bitarna med hjälp av |(1<<xxx). Jag förstår att en etta skiftas in på rätt position men det borde ju vara enklare att bara göra som jag gör ovan och slriva ett värde direkt till porten. (Det fungerade i alla fall för att skriva till porten)
Nåja detta blev ju ett långt första inlägg på forumet. Hoppas någon sitter på kunskap och ork för att hjälpa en stackars nybörjare.
MVH Jonas