Arduino ATtiny45 servoproblem
Re: Arduino ATtiny45 servoproblem
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
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
- 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
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?
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;
}
Re: Arduino ATtiny45 servoproblem
Prova detta:
Edit: Ändrade från PORTB till PINB, jag vet inte om det blir rätt
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;
}
- 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
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?
Kan det vara pinMode(RADIO_OPEN_PIN, INPUT); som ställer till det?
Re: Arduino ATtiny45 servoproblem
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:
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.
Kod: Markera allt
DDRB = (0<<RADIO_OPEN_PIN) | (0<<RADIO_CLOSE_PIN);
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.
- 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
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() :
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);
- 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
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.
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.