@Icecap:
Ska prova lite olika. Det finns mycket matnyttigt att läsa bland EF:s trådar. Tänkte testa lite olika och i mitt fall kommer inte resurser vara något problem då µC:n kommer vara väldigt överdimensionerad. Å andra sidan är det aldrig fel att tänka effektivt ändå.
@lillahuset:
Det här var också intressant! Du skiftar alltså in portstatusen (på vald ingång) i en byte med lagom intervall. Har du då bara en
if (skiftregister == 0xff) { Button_Status = 1; } som körs vid varje skiftning?
Ursäkta den låga nivån men jag vet tyvärr inte bättre. Korvspadet är grumligt.
Mycket bra tips och det som jag tänkte prova först var en variant som
Swech tipsade om i en annan tråd där man helt enkelt räknar upp/ner beroende på portstatus. När man nått önskat värde så är knappen tryckt.
Vi får se vart det slutar men jag tyckte verkligen
lillahuset
metod var enkel.
Nåja, inget av detta är värt att prata om så länge man inte kan hantera interrupts.
Nedan är den lilla kodsnutt jag provat med nu och när jag mäter med skopet på RC4:an så kommer pulserna med ganska exakt 30 Hz, vilket inte stämmer alls med uträkningen.
Vet inte hur jag ska göra för att verkligen bekräfta att systemklockan går i 64 MHz...
Kod: Markera allt
void init()
{
INTCON.TMR0IE = 1; // Enable TMR0 overflow interrupt
PIE1.TMR1IE = 1; // Enable TMR1 overflow interrupt
RCON.IPEN = 1; // Enable interrupt priority
INTCON.GIE = 1; // Enable global and high prio interrupts
INTCON.PEIE = 1; // Enable peripheral and low prio interrupts
INTCON2.TMR0IP = 1; // Timer0 overflow interrupt has high prio
IPR1.TMR1IP = 0; // Timer1 overflow interrupt has low prio
OSCCON = 0b01110010; // 16 MHz, PLL config bit enable = 64 MHz
T1CON = 0b00010001; // Use instruction clock, 1:2 prescaler, 8-bit timer
ANSELC = 0;
TRISC = 0;
LATC.B4 = 0;
}
// SKRIV TILL LAT, LÄS PORT
void interrupt(void)
{
if (PIR1.TMR1IF)
{
LATC.B4 = 1;
LATC.B4 = 0;
PIR1.TMR1IF = 0;
}
}
void main() {
init();
while(OSCCON.HFIOFS) // While clock is stable
{}
}