Hallo Ihr,
einen schönen Abend erstmal. Danke für eure Hilfe und Ratschläge.
Ich habe das oben genannte Programm und die zugehörige Header-Datei in Anlehnung an die Demo für die RNControl mit Hilfe von hier (danke Hubert.G - habe dabei ein bisschen projektorientiertes C gelernt) auf den mega16 (in der RNControl) gebracht und danach erfolgreich auf einen tiny2313. Der war mir zu speicherarm, daher der Umstieg auf den 168. Und nun sitze ich den zweiten Tag (die zweite Nacht) und nix geht voran
.
Die fuses passen - der 168 läuft nett, die Kontroll-LED blinkt (zum Auftakt - vor allen möglichen Initialisierungen) und der USART läuft auch schon hübsch.

Zitat von
m.a.r.v.i.n
... Einige Registernamen und Bedeutungen haben sich beim mega168 auch geändert (Timer z.B.)...
Das war in einem anderen Thread. Ja, leider muss ich das schmerzhaft, na ja, nicht wirklich - blos sehr zeitaufwendig - erleben. Ausserdem läuft mein Timer0 schon wieder nicht (CTC, 50µsec Timer für mehrere Zwecke).
Code:
void TMR_0_init( void )
{ //Initialisiere 8-Bit-Timer auf 10 kHz
TCCR0A |= (1<<WGM01); // Timer im CTC-Mode (doc S104)
TCCR0B |= (1<<FOC0A); // Forde Output Compare A (doc S105)
TCCR0B |= (1<<CS01); // Prescaler 1/8 / Clock <- CPU (doc S106)
OCR0A = 100; // Preset 100 für 50µs bei 16Mhz
TIMSK0 |= (1<<OCIE0A); // Compare Match IRQ
}
mit der ISR
Code:
/* === Nicht unterbrechbare ISR für timer ====================================== */
/* Diese Routine zählt hoch im Takt 20 kHz. Der Zählerwert wird von den ISR für
EXT_INT0 und -INT1 ausgelesen und den Werten Iz_yseci zugewiesen ...... */
// #define SIG_OUTPUT_COMPARE0A _VECTOR(14), siehe doc2545, S 63
SIGNAL(SIG_OUTPUT_COMPARE0A)
{
{
if (Izeit_1 < 60000) //Zeitstand Interrupt-Timer läuft von 1 .. 60 000
Izeit_1 ++; // d.h. alle 3 Sekunden wird der Stand erreicht
else
{ Izeit_1 = 0; // ansonsten: Rückstellen auf Null und
PORTC ^= (1<<PC2); } //LED3 toggeln, bei Izeit_1 max 60000 => 3 sec
}
PORTC ^= (1<<PC1); //LED2 toggeln, bei (prsc=1/8, OCR0=100)=> 0,050 ms
}
/* ============================================================================== */
/* ============================================================================== */
/* === HAUPTProgramm =========================================================== */
Es ist sogar leider so, dass USART läuft, aber keine PWM solange keine Interrupts erlaubt sind, aber natürlich eben dieser Timer nicht. Andersrum - wenn ich "sei" aktiviere, dann läuft kein USART - auch keine PWM und kein Timer0. Aber die main-Routine wird dauernd teilweise abgearbeitet . . . . offenbar ohne Aufruf der enthaltenen Routinen (sieht man am Blinzeln der LED
) und ohne die (ok, ok, die unschönen..) waitms nach dem Setzen von "sei".
Code:
/* ============================================================================== */
/* === HAUPTProgramm =========================================================== */
/* Initialisierungen, LED1 kurzblinken als Signal für Programmstart,
Ausgabe des Indentifizierungsstrings per USART
*/
int main(void)
{
/* Encoder-Eingang 1 PortD2
Encoder-Eingang 2 PortD3 */
/*###Initialisierungsphase### */
//Pins bzw. Ports als Ein-/Ausgänge konfigurieren
DDRB |= 0x87; //10000111 -> PB0- B2: Mot 1,2 + PWM 1,2/3,4, PB7 Mot 1,2
DDRC |= 0x7F; //01111111 -> PC0 .. 6 , kein PC7-Pin
DDRD |= 0xF0; //11110000 -> PD6,7 Mot 3,4 sowie PD2,3 extInt
//Initialisierungen
setportcon(0); setportcon(1); setportcon(2); //Ports C (m168 hat nur 7)
setportcon(3); setportcon(4); setportcon(5); //... aus
init_tmrPWM(); //Initialisierung Timer für PWM
init_USART0(MYUBRR); //USART0 initialisieren mit wählbarer Baudrate (s.o.)
TMR_0_init(); //Initialisiere den Timer0-Interrupt (10 kHz)
XTI01_init(); //Initialisiere den externen Interrupt 0 und 1
for(i=0; i<20; i++)
{
setportcoff(0); //2 sek blinken mit LED1 nach dem Reset -
waitms(15); // damit man kurze resets besser erkennt
setportcon(0);
waitms(85);
}
waitms(1000);
sei(); //Globalen Interrupt freigeben
setportcoff(0);
waitms(2000);
setportcon(0);
waitms(2000);
sendUSART("FLEX168 mit 2drehzmess-168.c\r\n");
sendUSART("Version ~x05 vom 08jan08 23:42 mit (sei)\r\n");
sendUSART("Timer ist initialisiert auf 50 µsec ? ? ?\r\n");
for(;;){
setportcoff(0);
waitms(1000);
setportcon(0);
waitms(1000);
Mlinksstop();
Mrechtsstop();
setPWMlinks(0);
setPWMrechts(0);
Motst_aufab();
setportcoff(0);
waitms(1000);
setportcon(0);
waitms(1000);
}
}
Ich habe das oben genannte Programm und die zugehörige Header-Datei in Anlehnung an die Demo für die RNControl mit Hilfe von hier (danke Hubert.G - habe dabei ein bisschen projektorientiertes C gelernt) auf den mega16 (in der RNControl) gebracht und danach erfolgreich auf einen tiny2313. Der war mir zu speicherarm, daher der Umstieg auf den 168. Und nun sitze ich den zweiten Tag (die zweite Nacht) und nix geht voran
.
Hätte da bitte jemand mal einen Rat? Ich sehe also einen Reset nach Setzen von "sei" und habe keinen Schimmer, warum das so ist. Danke im Voraus
Lesezeichen