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 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