Sida 1 av 1
Programmeringsfråga, ATMega8
Postat: 24 mars 2008, 14:41:58
av j.andersson
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.
Postat: 24 mars 2008, 14:58:15
av sodjan
Stannar ? Inga felmeddelanden ?
Sen verkar det lite konstigt om C-syntaxen skulle bero
på val av processor, det borde bero på val av C-kompilator.
Postat: 24 mars 2008, 15:06:53
av Icecap
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;
}
}
Hur man ska skriva för en AVR har jag ingen aning om men jag har ibland problem med att en bit-variabel ska styra en annan som true/false och det inte går bra då kompilern använder det oshiftade värdet.
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;
}
}
Postat: 24 mars 2008, 15:10:56
av strombom
Hur är P3_3 och P2_0 definerade ?
Postat: 24 mars 2008, 15:42:18
av j.andersson
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?
Postat: 24 mars 2008, 15:46:40
av sodjan
Skulle väl kunna vara "True" eller "TRUE" beroende på hur din
kompilator har valt att definierade det. Har du provat ??
Har du letat i dina H filer efter true/false definitioner ?
Postat: 24 mars 2008, 16:02:40
av Icecap
Jag har märkt att vissa kompilatorer inte har true & false definierat.
Jag brukar då inkludera mina egna definitioner via en fil:
typedef unsigned int WORD;
typedef unsigned char BYTE;
typedef unsigned lond DWORD;
#define true 1
#define false 0
Postat: 24 mars 2008, 16:05:03
av j.andersson
är detta ett bra sätt att definiera true och false själv ifall det inte finns definierat:
#ifndef false
#define false (0)
#define true (!(false))
#endif
?
Okej jag ska pröva vad som funkar
Postat: 24 mars 2008, 19:31:32
av exile
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:
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
}
hoppas att det var till någe hjälp ^^
Postat: 31 mars 2008, 19:46:00
av j.andersson
okej nu fick jag fixat det problemet
tack så mycket för hjälpen