Arduino ATtiny45 servoproblem

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Glattnos
Inlägg: 2972
Blev medlem: 29 oktober 2009, 20:01:18

Re: Arduino ATtiny45 servoproblem

Inlägg av Glattnos »

Jaha, ja att hitta lämplig klockfrekvens och prescaler kombination skulle hjälpa mycket. Jag försökte få till så att ett varv på 8-bitarsräknaren blev 1ms, men det närmaste jag kom(med det jag hade) var prescaler 64 och räkna till 150, vilket gör att servots rörelse-område med 256(hela 8-bitarsvärdet) blir ca 1,7ms när det normalt brukar sägas att den ska vara 1ms (pulslängd 1-2ms). Dock fixade mitt servo detta spann när jag kortade ner SHORTEST_SERVO_PULSE till 0,6ms istället för 1ms.

Det här med 50Hz är inte så jättenoga faktiskt utan är det typ mellan 30-60Hz så funkar det normalt sett. Så mitt "150-räknande" för att få 1ms är inte ens nödvändigt faktiskt men gav ändå en viss känsla av att ha någorlunda kontroll på tiden.

Det som jag siktade på i koden var att inte utföra någon "matte" eller "delays" så allt är bara avbrottsrutiner och flyttande av värden mellan olika platser så koden bör inte ta så mycket prestanda utan kan rulla lite smidigt i bakgrunden medan huvudprogrammet körs. Nått som är rätt smart men inte utnyttjat är att man även skulle kunna köra en TimerOverflowInterrupt på samma timer och då få en avbrottsrutin som inträffar med 1,7ms mellanrum, kan nyttjas till att sätta olika flaggor som huvudprogrammet sen får ta hand om :)
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: Arduino ATtiny45 servoproblem

Inlägg av Magnus_K »

Ska återgå till att testa din kod Glattnos så fort jag fått i ordning på dom "enkla" funktionerna.
Jag vet inte vad det är som spökar den här gången men jag måste ju tänka väldigt fel..

Pinne PB1 och PB2 ska vara ingångar och ställa servot i olika lägen. Nu råkar det vara så att jag inte ens klarar av att göra det.
Nedan har jag klippt ur det som rör just dessa pinnar.
Med exakt den koden så verkar den tolka både RADIO_OPEN och RADIO_CLOSE som "1" då servot går fram och tillbaka, utan jag jag själv ger en 1:a.

Skriver jag istället if(RADIO_OPEN_PIN == 1), och respektive på CLOSE, så tolkar den det som 0:or och flyttar inte servot det minsta, även om jag lägger 5V på en av ingångarna.

Vad är det som blir blir så tokigt? Är det att jag blandar "Arduino-språk" och C?
EDIT: Eller kan det vara relaterat till pull-up eller att den här kombon gör att jag inte läser av PINx-registret?

Kod: Markera allt

#define RADIO_OPEN_PIN PB1
#define RADIO_CLOSE_PIN PB2

int main(void)
{
  // initializations
  pinMode(RADIO_OPEN_PIN, INPUT);
  pinMode(RADIO_CLOSE_PIN, INPUT);

  while(1)
  {
   _delay_ms (1500);
    
    if(RADIO_OPEN_PIN){
      ActiveServoPositionPulse = ServoPositionOpen - ServoPositionOpenCal;
    }
    
    _delay_ms (1500);
    
    if(RADIO_CLOSE_PIN){
      ActiveServoPositionPulse = ServoPositionClose + ServoPositionCloseCal;
    }

  }

  return 0;
  
}
Glattnos
Inlägg: 2972
Blev medlem: 29 oktober 2009, 20:01:18

Re: Arduino ATtiny45 servoproblem

Inlägg av Glattnos »

Prova detta:

Kod: Markera allt

if(PINB & (1<<RADIO_OPEN_PIN) == 1)

Kod: Markera allt

#define RADIO_OPEN_PIN PB1
#define RADIO_CLOSE_PIN PB2
 
int main(void)
{
  // initializations
  pinMode(RADIO_OPEN_PIN, INPUT);
  pinMode(RADIO_CLOSE_PIN, INPUT);
 
  while(1)
  {
   _delay_ms (1500);
    
    if(PINB & (1<<RADIO_OPEN_PIN)){
      ActiveServoPositionPulse = ServoPositionOpen - ServoPositionOpenCal;
    }
    
    _delay_ms (1500);
    
    if(PINB & (1<<RADIO_CLOSE_PIN)){
      ActiveServoPositionPulse = ServoPositionClose + ServoPositionCloseCal;
    }
 
  }
 
  return 0;
  
}
Edit: Ändrade från PORTB till PINB, jag vet inte om det blir rätt
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: Arduino ATtiny45 servoproblem

Inlägg av Magnus_K »

Hmm, testad både PORTB och PINB på dom ställena nu och den vill inte flytta servot det minsta.
Kan det vara pinMode(RADIO_OPEN_PIN, INPUT); som ställer till det?
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: Arduino ATtiny45 servoproblem

Inlägg av Magnus_K »

Nej vänta, det fungerar! Mer info info inom kort!
Glattnos
Inlägg: 2972
Blev medlem: 29 oktober 2009, 20:01:18

Re: Arduino ATtiny45 servoproblem

Inlägg av Glattnos »

Ja jag tror inte att du kan använda pinMode utan att använda Arduinospråk där, prova detta istället för pinMode:

Kod: Markera allt

DDRB = (0<<RADIO_OPEN_PIN) | (0<<RADIO_CLOSE_PIN);
Fast default är alla pinnar input så utan kod för det så funkar det också :)
Sen måste du ha Pull-down motstånd tror jag om du vill dra pinnen hög när något ska inträffa. Annars är den flytande och kan trigga när du inte drar pinnen hög. Fast jag vet inte hur du kopplat.
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: Arduino ATtiny45 servoproblem

Inlägg av Magnus_K »

Det är en PT2272-M4:a som skickar D0 eller D1 hög beroende på vad den tar emot av sändaren.
Väldigt märkligt då den ger hög ut när jag matar den med 5V men pinnarna verkar inte orka "lyfta" till 5V när dom är ihopkopplade med PB1 och PB2... Känns väldigt konstigt.

EDIT: Gjorde så här nu istället för att använda pinMode() :

Kod: Markera allt

 DDRB = (0<<RADIO_OPEN_PIN) | (0<<RADIO_CLOSE_PIN) | (0<<SERVO_OPEN_PIN) | (0<<SERVO_CLOSE_PIN) | (1<<SERVO_CMD_PIN);
 PORTB = (0<<RADIO_OPEN_PIN) | (0<<RADIO_CLOSE_PIN) | (0<<SERVO_OPEN_PIN) | (0<<SERVO_CLOSE_PIN);
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: Arduino ATtiny45 servoproblem

Inlägg av Magnus_K »

Jag är väldigt tacksam för hjälpen! Ovärderligt!
Efter lite labbande igår kväll så visade det sig att jag hade eldat radiomodulen. Med en ny modul på plats så fungerade allt klockrent.
Väldigt bra att veta (få reda på) hur man skriver till port/pin-registret också. Dock lite förvirrande när man meckat mest med PIC och då betyder 1:a att det är en ingång :)

Skulle egentligen vilja lyxa till det med att sätta enheten i sleep också men nu får det vara nog för denna gång.

Ska ta kvällen till att snygga till koden och testa din senaste version Glattnos, men känns skönt att ha programmeringsbiten klar.
Skriv svar