Sida 2 av 2
Re: Nybörjare på AVR. Hjälp med C kod
Postat: 22 april 2011, 15:04:22
av stekern
sodjan skrev:>
> Vissa kompilatorer VILL ha int main().
Lite märkligt om en kompilator för mikrokrontrollers kräver det.
På plattformat med ett OS är det väl dock en förutsättning för att
kunna lömna ett exit-status tillbaka till "skalet", men det är inte
rellevant i detta fall.
Inte alls särskilt märkligt eftersom c standarden kräver det.
Re: Nybörjare på AVR. Hjälp med C kod
Postat: 22 april 2011, 15:57:45
av jesse
monstrum skrev:Jesse: Nu gjorde du nog en tankevurpa. DDRC &= ~0x02 sätter ju inte alla bitar höga. And med inversen av 0000 0010 kommer ju sätta bit 1 (andra biten) till 0.
Blandade ihop lite olika saker där... tyckte att han hade skrivit
DDRC = ~0x02; nånstans, men jag läste väl fel... Hur som helst så lade jag till detta efteråt:
jesse skrev:skriver du DDRC = ~0x04; (utan AND) så kommer alla andra bitar bli utgångar eftersom dom blir ettor. Men om du istället skriver DDRC &= ~0x04; (med AND) så kommer de andra bitarna att behålla sitt gamla värde
I och med detta så blir ju alla bitar ingångar i alla fall.... även om 0x02 var fel bit. Så det var lite tur att det inte blev nån kortslutning i det här fallet. I den första versionen hade han tur också och satte FEL port till utgång och alla andra till ingångar. Fel och fel igen = rätt. Tur och tur igen.
Re: Nybörjare på AVR. Hjälp med C kod
Postat: 22 april 2011, 16:18:34
av ekman
Tycker fortfarande att det är rätt krångligt. Men förstår lite bättre nu.
Kan nån förklara lite närmare på hur (1<<3) funkar i PORTA &= ~(1<<3) ?
kan man säga att (1<<3) är lika som 0000 0100? då 1 är den logiska nivån man vill ställa in och 3 är positionen.
Så förenklat (i mina ögon) blir: PORTA = PORTA & ~(0000 0100). Och ~ inventerar 0000 0100 till 1111 1011 ?
Så det blir som PORTA = PORTA & 1111 1011. Nån som förstår hur jag tänker ?
Tänker jag riktigt nu? :
Här ändrar man utan att ta hänsyns till vad DDRC hade i registret förut
DDRC = ~0x04; är lika som DDRC = 1111 1011
Här jämför man värdet i DDRC med AND mot 1111 1011
DDRC &= ~0x04; är lika som DDRC = DDRC & 1111 1011
Re: Nybörjare på AVR. Hjälp med C kod
Postat: 22 april 2011, 16:25:01
av Micke_s
1<<3 skiftar biten 3 gånger vänster, >> ger åt höger
allså blir
0b00000001<<3 =>
0b00001000
och
~0b00001000 =>
0b11110111
Detta kommer sätta bit 3 till noll för PORTA, så du tänker rätt.
Snabbare variant att släcka biten är annars: PORTA &= ~(1<<3), vilket är samma sak som skriva PORTA = PORTA & ~(1<<3)
Re: Nybörjare på AVR. Hjälp med C kod
Postat: 22 april 2011, 16:39:35
av jesse
bitarna numreras från höger till vänster från 0 till 7.
PORTA: PA0 = 0, PA1 = 1, .... , PA7 = 7.
(1 << PA0) = 0000 0001
(1 << PA1) = 0000 0010
(1 << PA2) = 0000 0100
(1 << PA3) = 0000 1000
(1 << PA4) = 0001 0000
(1 << PA5) = 0010 0000
(1 << PA6) = 0100 0000
(1 << PA7) = 1000 0000
Re: Nybörjare på AVR. Hjälp med C kod
Postat: 22 april 2011, 16:47:37
av Korken
snigelen skrev:Korken skrev:Skriva en etta till ett DDR-register sätter den som ingång
Du menar utgång?
Hehe, ja det menar jag.
