Forum: Mikrocontroller und Digitale Elektronik C167, HighTec GCC: Endlosschleife, Variablenzugriff


von Andreas (Gast)


Lesenswert?

Hallo!

Bin relativ neu darin, den (alten) C167 zu programmieren und habe leider 
ein paar Schwierigkeiten:

Serielle Schnittstelle aktivieren funktioniert, Daten senden ebenfalls 
(einfach auf S0TBUF schreiben und S0TIC löschen) und sie kommen auch am 
PC richtig an. Soweit so gut.

Ein größeres Problem habe ich mit Variablen! Ich kann sie zwar 
deklarieren und auch darauf zugreifen, aber Zuweisungen funktionieren 
nicht!

Setze ich zB
1
int i;
2
i=0;
3
S0TBUF = i;

dann kommt irgendein Wert (letztens -47) aber nicht 0. If-Abfragen 
funktionieren prinzipiell, fragen aber nicht den zugewiesenen Wert ab, 
sondern eben jenen, der auch über die serielle Schnittstelle gekommen 
ist.

Woran kann das liegen? Ich benutze den HighTec GCC Compiler auf Linux. 
Der C167 ist ein C167CR-LM.

Besten Dank!

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Andreas schrieb:
> Ein größeres Problem habe ich mit Variablen! Ich kann sie zwar
> deklarieren und auch darauf zugreifen, aber Zuweisungen funktionieren
> nicht!
Hört sich nach vergessenem volatile an...

> Setze ich zB
> int i;
> i=0;
> S0TBUF = i;
Diesen Code sollte der Compiler sowieso optimieren und so ausführen:
 S0TBUF = 0;

Fazit: das Problem liegt (wie üblich) nicht im geposteten Code.
Zeig doch mal wesentlich mehr von deinem Code: wo wird die Variable 
beschrieben, wo wird sie gelesen?

von Andreas (Gast)


Lesenswert?

Gerne, aber der Code ist nicht viel länger:
1
#include <c167.h>
2
#include <stdio.h>
3
4
#define TBIR (1<<7)
5
6
7
void main(void)
8
{
9
  int i;
10
  i=0;
11
  
12
  P3  |= 0x0400;        // SET PORT 3.10 OUTPUT LATCH (TXD)             
13
  DP3 |= 0x0400;        // SET PORT 3.10 DIRECTION CONTROL (TXD OUTPUT) 
14
  DP3 &= 0xF7FF;        // RESET PORT 3.11 DIRECTION CONTROL (RXD INPUT)
15
  S0TIC = 0x80;         // SET TRANSMIT INTERRUPT FLAG                  
16
  S0RIC = 0x00;         // DELETE RECEIVE INTERRUPT FLAG   
17
  DP3     |= 0xF2F0;      
18
  S0BG  = 0x1F;       // set baudrate to 19.2 
19
  S0CON = 0x8011;     // SET SERIAL MODE    
20
21
  for(i=0; i<10; i++)
22
  {
23
     S0TBUF = 'h'+(char)i;
24
     while((S0TIC & TBIR) != TBIR);
25
     S0TIC = 0;
26
  }
27
      
28
  if(i < 10)
29
  {
30
    S0TBUF = 'h';
31
    while((S0TIC & TBIR) != TBIR);
32
    S0TIC = 0;
33
  }
34
  else {
35
    S0TBUF = 'p';
36
    while((S0TIC & TBIR) != TBIR);
37
    S0TIC = 0;      
38
  }
39
  S0TBUF = 'l';
40
  while((S0TIC & TBIR) != TBIR);
41
  S0TIC = 0;     
42
   
43
}

Mein erwarteter Output wäre also
1
hijklmnopqpl
Das erscheint auch am Simulator (tucson). Tatsächlich erhalte ich über 
die serielle Schnittstelle
1
pl
und das in Endlosschleife (wieso Endlosschleife???). Volatile hab ich 
ausprobiert, mach aber (leider!) keinen Unterschied.

von Andreas B. (aboehler)


Lesenswert?

OK, ich hab es selbst hinbekommen: Der XRAM wird durch den Startup-Code 
des HighTec-Compilers nicht aktiviert. Nach setzen von XPEN in SYSCON 
funktionieren die Variablen so, wie sie sollen. Meine Memory Map war 
(auch vorher schon) auf den XRAM ausgelegt.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.