Sida 1 av 1

Stega upp portar i C, Renesas M16C

Postat: 22 april 2008, 16:05:37
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?

Postat: 22 april 2008, 16:21:14
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.

Postat: 22 april 2008, 16:25:44
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.

Postat: 22 april 2008, 16:38:33
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)

Postat: 22 april 2008, 20:19:24
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: