Kein Rücksprung aus Unterprogammen zurücl in die Main
Moin moin zusammen,
vielen Dank für die Begrüßung in den Tipp eines neuen Threads. Daher hier nochmal den Gleichen Text meines Problems zzgl. meines Quelltextes. Ich denke auch, dass es entweder ein C-Problem ist bzw. mit der Speicherverwaltung zusammenhängt... Aber erstmal zum Problem:
Im Studium wurde ich kürzlichst mit der uC-Programmierung konfrontriert und habe glatt so viel gefallen daran gefunden, dass ich mir einen RP6 zugelegt habe.
In anhlehnung an mein Studium, wo ich den Infineon XC161 kennenlernte, möchte ich den RP6 nun von Grund auf neu programmieren.
Hier kurz die Rahmendaten:
- RP6 mit ATMEGA32L + RP6-Control mit ATMEGA32
- nutze AVR Studio 4
- und mitgelieferte GCC
Die ersten Schritte waren bisher mühsam aber gelangen. Wobei mir noch immer nicht so ganz klar ist, wie ich bei einem neuen Projekt für diese Prozessoren die Speichereinstellungen vornehmen muss?
Im weiteren habe ich bisher ein einfaches Init-Unterprogramm geschrieben, mit dem ich die auf dem RP6 vorhandenen LEDs initialisiere. Aus diesem Unterprogramm kommt der Programmablauf auch korrekt zurück.
Arbeite ich - wofür auch immer / hier z.B. um gezielt einzelne LEDs zu schalten - mit einem weiteren Unterprogramm, bleibt der Programmablauf sowohl in der Simulation, als auch in der Hardware am Ende des Unterprogramms stehen. Steppe ich durch die Simulation, schaltet der Simulator dann an der Stelle wo ich den Rücksprung in die Main erwarte auf Running.
Ein weiteres Problem, was ich gerne ansprechen möchte ist folgendes:
Wieso kann ich ausser in der MAIN keine lokalen Variablen anlegen? Hierbei kommt es dann bereits zu einem Fehler beim Übersetzen. Hängt das mit der womöglich noch nicht korrekt angelegten "Speicherverwaltung" in den Einstellungen des Projektes zusammen?
Schonmal vorab vielen Dank für die Hilfe,
MfG,
Oppi
Quelltext:
Code:
int main(void)
{
RP6_init_LEDs();
setLeds(leds);
while(1){
if(MAX_COUNT == i){
leds = leds << 1;
if(0x40>leds)
leds = 0x1;
i=0;
}
}
return 1;
}
Hier der Text zum besagten Unterprogramm:
Code:
#include "RP6_First_Action.h"
unsigned char portB = 0, portC = 0, actLeds;
void RP6_init_LEDs(void)
{
PORTB &= ~0x83;
DDRB = 0x83;
PORTC &= ~0x70;
DDRC = 0x70;
actLeds = ((PINC & (SL4|SL5|SL6)) >> 3) | (PINB7 >> 4) | (PINB1 << 4) | (PINB0 << 5);
}
void setLeds(unsigned char leds)
{
portB = 0;
portC = 0;
portC = ((leds & 0x7) << 4); // SL1-SL3
portB = ((leds & SL4) << 4); // SL4
portB |= ((leds & SL5) >> 3); // SL5
portB |= ((leds & SL6) >> 5); // SL6
if( (actLeds & 0x7) != (leds & 0x7) ) // Setzen der LEDs SL1-SL3
PORTC = (PORTC & 0xF8) | portC;
if( (actLeds & 0x38) != (leds & 0x38) )
PORTB = (PORTB & 0xF8) | portB;
nop();
}