Vielen Dank für die Blumen. Dabei beruht mein Können beim Programmieren im wesentlichen auf das, was ich im letzten Quartal im Studium gemacht habe.
Die mitgelieferten Bibliotheken habe ich bewusst nicht verwendet, da genau das mein Bestreben ist, dass ich den RP6 von grundauf selbst mit Leben füttern möchte.
Grundsätzlich habe ich mir angewöhnt, Funktionsprototypen in einer Headerdatei zu sammeln und Funktionen in andere Dateien auszulagern. Entsprechend sind die Varaiablen alle vorhanden. Ich werde gleich nochmal alles aufführen. Ich dachte nur, dass ich Teile weglasse die meiner Ansicht nach nicht die Ursache darstellen.
Mit Speicherverwaltung meine ich die Memory Settings, welche man in den Projektoptionen vornehmen kann. Dort kann man im AVR Studio ja sagen, bei welcher Adresse welcher Speicher beginnt bzw. ab welcher Adresse der Speicher eingeblendet wird. Oder muss ich beim AVR dort keine Einstellungen vornehmen? (Flash, EEPROM und SRAM)
Ok, lokale Variablen akzeptiert der nun, nachdem ich den Optimierungsgrad reduziert habe.
Hier nochmal die Inhalte der drei Dateien. Zunächst die, welche auch die Main enthält. Diesmal vollständig (c; Hier möchte ich zunächst nur aus Testzwecken die Sechs LEDs auf dem RP6 durchlaufen lassen.
Code:
#include "RP6_First_Action.h"
#define MAX_COUNT 500000
int i=0;
unsigned char leds = 0x3F;
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 Inhalt meiner Headerdatei. Die Funktionsprototypen, zu denen die eigentliche Fubktion noch nicht steht, habe ich noch auskommentiert.
Code:
#include <avr/io.h>
#include <avr/sfr_defs.h>
#include <avr/interrupt.h>
#include <avr/sleep.h>
#include <stdio.h>
#include <stdlib.h>
#define ON 1
#define OFF 0
#define SL1 0x01
#define SL2 0x02
#define SL3 0x04
#define SL4 0x08
#define SL5 0x10
#define SL6 0x20
#define nop() asm volatile("nop\n\t")
extern void RP6_init_LEDs(void);
extern void setLeds(unsigned char leds);
//extern void RP6_init_Bumpers(void);
Hier nochmal die komplette Datei mit meinen ausgelagerten Funktionen. Hierzu sei erwähnt, dass es keinen Unterschied macht, ob die Funktion in der gleichen Datei wie die Main liegt oder extern ist. Das habe ich probiert. Mich irritiert schon, dass ich beim AVR Studio die Main mit einer return beenden muss. Ich lernte, solche Dinge aus Speicherplatz gründen zu lassen, auch wenn ich es für "ordentlicher" erachte.
Code:
#include "RP6_First_Action.h"
unsigned char 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)
{
unsigned char 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();
}
/*
void RP6_init_Bumpers(void)
{
;
}
*/
In der ASM-Ansicht bin ich nicht weiter gekommen. Dort schaltet der Debugger zwar an der entsprechenden Stelle nicht auf running, aber er springt auch nicht zurück. Hier fehlt mir dann doch die Erfahrung. Ebenso bzgl WDT.
Lesezeichen