Nybörjare på AVR. Hjälp med C kod

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
stekern
Inlägg: 453
Blev medlem: 2 november 2008, 08:24:18
Ort: Esbo, Finland

Re: Nybörjare på AVR. Hjälp med C kod

Inlägg 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.
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: Nybörjare på AVR. Hjälp med C kod

Inlägg 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.
ekman
Inlägg: 280
Blev medlem: 13 januari 2009, 14:04:35

Re: Nybörjare på AVR. Hjälp med C kod

Inlägg 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 ? :humm:

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
Användarvisningsbild
Micke_s
EF Sponsor
Inlägg: 6741
Blev medlem: 15 december 2005, 21:31:34
Ort: Malmö

Re: Nybörjare på AVR. Hjälp med C kod

Inlägg 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)
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: Nybörjare på AVR. Hjälp med C kod

Inlägg 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
Användarvisningsbild
Korken
Inlägg: 2230
Blev medlem: 3 februari 2006, 19:19:36
Ort: Luleå, Porsön

Re: Nybörjare på AVR. Hjälp med C kod

Inlägg 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. :)
Skriv svar