Stega upp portar i C, Renesas M16C

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
El-Björn
Inlägg: 96
Blev medlem: 16 januari 2005, 02:28:16
Ort: Kungälv

Stega upp portar i C, Renesas M16C

Inlägg av El-Björn »

Jag håller på att skriva ett program till en M16C som ska sköta timing och riktning av en stegmotor.

Portarna är definierade så här:

Kod: Markera allt

#define MTR1			p?_?
#define MTR2			p?_?
#define MTR3			p?_?
#define MTR4			p?_?
Frågetecknen ska ersättas med lämpligt nummer sedan när jag ska koppla in drivkretsen.

Om vi förbiser timingen så länge för att hålla detta så rent som möjligt, så är jag ute efter att göra något sånt här:

Kod: Markera allt

int i=1;
char phase[] = {ph1; ph2; ph3; ph4};
while(villkor) {
    phase[i] = ON;
    Delay
    phase[i] = OFF;
    Delay
    i++;
    if(i==5) i=1;
}
Jag hoppas att min fulhackade pseudo-kod går att läsa.

Jag vet att det inte går att göra så som står ovan, för det skulle försöka lagra texterna "ON" och "OFF" på de positionerna som anges, men jag hoppas att min tanke går fram. Men hur ska jag tänka? Ska jag titta lite mer på pekare?
Användarvisningsbild
$tiff
Inlägg: 4941
Blev medlem: 31 maj 2003, 19:47:52
Ort: Göteborg
Kontakt:

Inlägg av $tiff »

Istället för en vektor, anropa istället en (inline) funktion, t.ex.

Kod: Markera allt

  phase_on(int number)  {
  if (number=1) MTR1=1;
  else if (number=2) MTR2=1;
  //etc...
}
och motsvarande för off.
MTR1 = 1 funkar kanske inte så lätt, men ersätt det med ett kommando som utför det du är ute efter.
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Jag (som har ganska mycket erfarenhet, även med M16C) hade ju gjort det ganska annorlunda.

Först och främst hade jag sett till att MTRx sitter på en port, "bredvid varandra". Detta medger att man kan skicka ut bitmönster enklare.

Sedan hade jag givit denna styrsekvens en egen timer (finns ju rikligt) och gjort en uppslagstabell som håller rätt mönster för en hel cykel.

Detta betyder att man dels kan variera hastigheten vid att ställa timerns längd, dels att man kan låta den köra autonomt.

Självklart bör man ha lite flaggor och variabler. Det kan behövas:
* Riktningsindikator. Kan kombineras till "Gör inget", "Vänster", "Höger".
* Hastighet.
* Stegning av hastighet (om det behövs)
* Antal steg i ställd riktning.

På det vis kan man låta interrupten ta hand om allt det tråkiga och bara låta en startrutin ta hand om att ställa in rätt värden och aktivera stegmotorns interrupt. När ISR'n är klar stoppar den sig själv efter att ha ställd riktningsindikatorn till "Gör inget".

Detta värde kan sedan avkännas av andra programdelar för att avgöra om motorn håller på eller inte.
Användarvisningsbild
El-Björn
Inlägg: 96
Blev medlem: 16 januari 2005, 02:28:16
Ort: Kungälv

Inlägg av El-Björn »

Tack för de snabba svaren!

Jag tror jag ger mig på $stiffs version innan jag ger mig på IceCaps. Jag är nybörjare, så jag tar det lite stegvis med motorstyrningen. (OBS! Ordvits)
Användarvisningsbild
$tiff
Inlägg: 4941
Blev medlem: 31 maj 2003, 19:47:52
Ort: Göteborg
Kontakt:

Inlägg av $tiff »

Jag hade också gjort som Icecap, om det hade funnits utrymme att använda I/O som är bit-grannar i registerna. För min egen del har jag redan sådana bibliotek skrivna, fast till AVR så klart :wink:
Skriv svar