Programmeringsfråga, ATMega8

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
j.andersson
Inlägg: 4
Blev medlem: 24 mars 2008, 14:18:20
Ort: Vasa

Programmeringsfråga, ATMega8

Inlägg 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.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg 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.
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg 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;
    }
  }
Användarvisningsbild
strombom
Inlägg: 3305
Blev medlem: 27 maj 2003, 10:50:20
Ort: Västra Götaland
Kontakt:

Inlägg av strombom »

Hur är P3_3 och P2_0 definerade ?
j.andersson
Inlägg: 4
Blev medlem: 24 mars 2008, 14:18:20
Ort: Vasa

Inlägg 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?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg 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 ?
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg 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
j.andersson
Inlägg: 4
Blev medlem: 24 mars 2008, 14:18:20
Ort: Vasa

Inlägg 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
Användarvisningsbild
exile
EF Sponsor
Inlägg: 496
Blev medlem: 21 oktober 2005, 23:32:07

Inlägg 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 ^^
j.andersson
Inlägg: 4
Blev medlem: 24 mars 2008, 14:18:20
Ort: Vasa

Inlägg av j.andersson »

okej nu fick jag fixat det problemet :D
tack så mycket för hjälpen
Skriv svar