Programmeringsfråga, ATMega8
-
- Inlägg: 4
- Blev medlem: 24 mars 2008, 14:18:20
- Ort: Vasa
Programmeringsfråga, ATMega8
Jag håller på och försöker få ett C-program som är gjort för en AT89S52 mikroprocessor att fungera med ATMega8. Programmet är gjort i Keil, själv använder jag AVR Studio 4.
Kan någon ge tips hur man får denna kod att fungera:
while(1){
P3_3 = ~P2_0;
if (P2_0 == 1){
scale= 4;
}
Problemet är den andra raden i koden ovan, utgången P3_3 blir hög om ingången P2_0 är låg och tvärtom. Hur ska man skriva detta för ATMega 8:n? Nu när jag försöker simulera programmet i AVR Studio så stannar det alltid på den raden och går inte vidare.
Kan någon ge tips hur man får denna kod att fungera:
while(1){
P3_3 = ~P2_0;
if (P2_0 == 1){
scale= 4;
}
Problemet är den andra raden i koden ovan, utgången P3_3 blir hög om ingången P2_0 är låg och tvärtom. Hur ska man skriva detta för ATMega 8:n? Nu när jag försöker simulera programmet i AVR Studio så stannar det alltid på den raden och går inte vidare.
Kod: Markera allt
while(1) // Betyder att den upprepas evigt...
{
P3_3 = ~P2_0; // P3_3 = Motsatsen av P2_0
if(P2_0)
{
scale= 4;
}
}
Då brukar jag göra såhär:
P3_3 = !(P2_0 && true); // P3_3 = Motsatsen av P2_0
(P2_0 && true) "gör om" P2_0 till en sant/falskt uttryck, '!' ger motsatsen och detta kan man då skicka till en annan bitvariabel.
Samma kompiler har problem med " if(P2_0 == 1)" fast inte exakt det uttryck för OM P2_0 är 1 blir värdet ju 1, hade det varit P2_2 som var grejen ville resultatet bli 4 så "if(P2_2 == 1)" ville då aldrig bli sant.
Av den anledning kollar jag så långt som möjligt inte om en sant/falskt har ett visst värde men bara "if(P2_0)" då allt annat än 0 är sant. Oftast finner jag det även mer logisk: "if(P2_0)" betyder "om P2_0 är sann då händer ..." och "if(!P2_0)" betyder "om INTE P2_0 är sann då händer ..."
Alltså skulle det i mitt program se ut såhär:
Kod: Markera allt
while(1) // Betyder att den upprepas evigt...
{
P3_3 = !(P2_0 && true); // P3_3 = Motsatsen av P2_0
// P3_3 = P2_0 ^ true; // Alternativt sätt att skriva samma sak
if(P2_0)
{
scale= 4;
}
}
-
- Inlägg: 4
- Blev medlem: 24 mars 2008, 14:18:20
- Ort: Vasa
Jo alltså jag använder AVR GCC kompilator.
P3_3 kallar jag PB1 i min kod och den är definierad som utgång. P2_0 kallar jag PB2 och den är definierad som ingång.
När jag försöker kompilera "P3_3 = !(P2_0 && true); // P3_3 = Motsatsen av P2_0" så får jag error på grund av odefinierat "true". Ska jag inkludera någon speciell h-fil för att få detta att fungera?
P3_3 kallar jag PB1 i min kod och den är definierad som utgång. P2_0 kallar jag PB2 och den är definierad som ingång.
När jag försöker kompilera "P3_3 = !(P2_0 && true); // P3_3 = Motsatsen av P2_0" så får jag error på grund av odefinierat "true". Ska jag inkludera någon speciell h-fil för att få detta att fungera?
-
- Inlägg: 4
- Blev medlem: 24 mars 2008, 14:18:20
- Ort: Vasa
Hur portarna används är lite annorlunda än på 8052 (AT89S52).
för det första har vi tre register på varje port.
PINx PORTx DDRx
PINx är avläsning av porten och läser av portens fysiska "nivåer" på porten.
PORTx är "ut" av porten och kan skriva ut till porten om DDRx är rätt satt, och läser man PORTx så får man det som har skrives till porten och inte det faktiska fysiska läge. (vid inport kan PORTx användas för att aktivera inbyggda pull-up motsånden)
DDRx bestämmer om porten är ingång eller utgång, så vida inget "tillbehör" ta över funktionen exempel usart, mm...
Så hur är PB1 definead:
#define PB1 1
Så ludna varken PORTB, PINB eller DDRB.
således kommer kompilatorn att klaga om du försöker sätta PB1 = ~PB2; <=> 1 = ~2;
vilket inte går....
Så hur brukar man "normalt" göra då?
Exempel:
hoppas att det var till någe hjälp ^^
för det första har vi tre register på varje port.
PINx PORTx DDRx
PINx är avläsning av porten och läser av portens fysiska "nivåer" på porten.
PORTx är "ut" av porten och kan skriva ut till porten om DDRx är rätt satt, och läser man PORTx så får man det som har skrives till porten och inte det faktiska fysiska läge. (vid inport kan PORTx användas för att aktivera inbyggda pull-up motsånden)
DDRx bestämmer om porten är ingång eller utgång, så vida inget "tillbehör" ta över funktionen exempel usart, mm...
Så hur är PB1 definead:
#define PB1 1
Så ludna varken PORTB, PINB eller DDRB.
således kommer kompilatorn att klaga om du försöker sätta PB1 = ~PB2; <=> 1 = ~2;
vilket inte går....
Så hur brukar man "normalt" göra då?
Exempel:
Kod: Markera allt
DDRB |= (1<<PB0); //sätter "portb0" till utgång
for(;;){
if ( PINB & (1<<PB1))
PORTB &= ~(1<<PB0);// sätter "portb0" till 0
else
PORTB |= (1<<PB0);// sätter "portb0" till 1
}
-
- Inlägg: 4
- Blev medlem: 24 mars 2008, 14:18:20
- Ort: Vasa