Forum: Mikrocontroller und Digitale Elektronik Problem mit M16C und HEW


von Michael S. (dd4ms)


Lesenswert?

Hallo Leute,

ich habe ein Problem mit der Entwicklungsumgebung HEW 4 und den KPIT GNU 
Compiler.

Ich schaffe es nicht den Port 9 als Ausgang zu definieren. Bin am 
verzweifel.
Ich weis nicht ob es eine Einstellung am Compiler ist oder ob ich zu 
doof bin.

#include "iodefine.h"
#include <stdio.h>


 void init(void) {

  pd7.byte = 0xff;
  p7.byte = 0x00;
  prc2 = 1;
  pd9.byte = 0x00;
  prc2 = 0;
  p9.byte = 0x00;


  #define taster p9.byte
  #define led p7_4
 }

int main (void)
{
    // TODO: add application code here


  init();
    while (1){

    if(taster >= 0x01) { led = 1;}

    else { led = 0;}
    }

  return (0);
}

Vieleicht kann mir jemand helfen!

mfg Michael

von Ekschperde (Gast)


Lesenswert?


von Rudi (Gast)


Lesenswert?

> Ich schaffe es nicht den Port 9 als Ausgang zu definieren

soll Port9 wirklich als AUSGANG fungieren? - du hast dort deinem 
Programm nach aber einen Taster angeschlossen - das spricht für einen 
EINGANG - so wie du es auch im Programm deklariert hast.

Rudi

von Michael S. (dd4ms)


Lesenswert?

Hi,

sorry habe mich verschrieben. Soll natürlich ein Eingang sein.

Mit den IO Manager habe ich es probiert. Aber es funzt trotzdem nicht.

von Sascha F. (sascha_focus) Benutzerseite


Lesenswert?

Soweit ich es noch in Erinnerung habe, ist Port 9 Protected. Dieses muß 
noch aufgehoben werden.

Gruß Sascha

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Sascha Focus wrote:
> Soweit ich es noch in Erinnerung habe, ist Port 9 Protected. Dieses muß
> noch aufgehoben werden.
>
> Gruß Sascha

Das machen die Zeilen

  prc2 = 1;  // Schreibschutz aufheben
  //...
  prc2 = 0;  // Schreibschutz setzen

Aber

  p9.byte = 0x00;

sehe ich ausserhalb dieser Schreibschutz-Klammer. Vielleicht diese 
Anweisung in die Klammer reinziehen.

Disclaimer: Ins Datenblatt habe ich nicht geschaut, ob der Wert 0x00 
korrekt ist oder ob p9 solch ein geschützter Port ist.

von Sascha F. (sascha_focus) Benutzerseite


Lesenswert?

Ok, man sollte besser lesen:

"
  prc2 = 1;
  pd9.byte = 0x00;
  prc2 = 0;
"

Hast du ja anscheinend gemacht.

von Michael S. (dd4ms)


Lesenswert?

hi,

ich dreh hier gleich noch durch. Es kann doch nicht so schwer sein einen 
Port als Eingang zu betreiben.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Wie ist der Taster angeschlossen? Kann es sein, dass dir der Pill-Up zu 
Vcc (bei active-low) oder der Pull-Down zu GND (bei active-high) fehlt?

Zu active-...
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Tasten_und_Schalter

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Im Datenblatt (Hardware Manual) vom M16C/28 steht was,

dass das PACR (pin assignment control) Register korrekt zu 
initialisieren ist jenachdem ob 80-Pin oder 64-Pin Version. Ohne diese 
Initialisierung arbeiten einige Pins nicht korrekt.

dass der Schreib- und Lesezugriff auf P9 nicht in die 
Schreibschutzklammer rein muss. Nur der PD9 Zugriff.

von Martin (Gast)


Lesenswert?

Welchen M16C benutzt du denn genau?

von Michael S. (dd4ms)


Lesenswert?

Hi

den M16C62A 100Pin V.

von Obelix X. (obelix)


Lesenswert?

Bist du dir sicher, dass
> taster >= 0x01
richtig ist? Normal hat man Pullups an den Eingängen. Wenn du nur einen 
Pin auf Low ziehst hast du nach wie vor einen Wert >= 1. Hast du 
überhaupt Pullup angeschlossen? Die Internen Pullups hast du ja nicht 
eingeschaltet.

Nur mal als Hinweis:
PRC2 brauch man nicht wieder auf 0 zurück setzen. Vor PRC2=1 MÜSSEN alle 
Interrupts gesperrt werden.
"Set the PRC2 bit to 1 (write enabled) and then write to any address, 
and the PRC2 bit will be cleared to 0
(write protected). The registers protected by the PRC2 bit should be 
changed in the next instruction after
setting the PRC2 bit to 1.  Make sure no interrupts or DMA transfers 
will occur between the instruction in
which the PRC2 bit is set to 1 and the next instruction.  The PRC0, PRC1 
and PRC3 bits are not automati-
cally cleared to 0 by writing to any address.  They can only be cleared 
in a program."

von Michael S. (dd4ms)


Lesenswert?

Hallo Leute,

es handelt sich um das Board von: 
http://www.mikrocontroller.com/de/m16c-ctrl.php

Die Schaltung ist so aufgebaut das Taster 1 bis 5 über 100k auf GND 
gezogen werden. Also ein Klassisches externes PullDown. Beim schließen 
dann mit 1k auf VCC.

Dennach müsste in Ruhestellung an den Portpins 0V anliegen. Also eine 
logische =0. Bei betätigen 5V logisch 1.

Diese Zustände müsste ich ins Port Register einlesen und auswerten 
können.

Funz aber nicht.

Zur Kontrolle ob ich den Port abgeschossen habe, habe ich ein Beispiel 
.mot File eingespielt. Da funzt die Eingabe über die Tasten.

Nur die Quelldateien kann ich auch nicht übersetzen. Dann überschlagen 
sich die Fehlermeldungen bei mir.

von Olaf (Gast)


Lesenswert?

Mal eine bloede Frage, aber was ist das hier fuer eine komische 
Definition?

    pd9.byte = 0x00;

Bei mir sieht das z.B so aus:

  prc2 = 1;    /* Das Direktion-Register von Port9 muss freigeschaltet 
werden! */
  pd9 |= 0x60; /* Alle genutzten Port auf Ausgang schalten */
  pd9_7 = 0;   /* Dateneingang */
  pd4 |= 0x1f;
  prc2 = 0;

/* Dateneingang vom RFM12 Modul */
int  RF12_DATA_in(void) {  if (p9_7 == 0) return(FALSE);
                           else return(TRUE); };



Obiges habe ich mal 1:1 so aus einem funktionierendem Programm von mir
kopiert. Ich schreibe also in pd9. Ich benutze jetzt zwar nur noch den 
gcc, habe das aber mit dem Renesascompiler genauso gemacht.

Olaf

von Michael S. (dd4ms)


Lesenswert?

Hallo Olaf,

die def ist vom KPIT GNU Compiler.

von Obelix X. (obelix)


Lesenswert?

@Olaf
Dein Code ist nicht richtig, siehe meinen Hinweis von oben. Nach einem 
Zugrif auf pd9 wird PRC2 ->Automatisch<- auf 0 gesetzt und damit wieder 
gesperrt.

von Olaf (Gast)


Lesenswert?

> Dein Code ist nicht richtig, siehe meinen Hinweis von oben.

Mein Code funktioniert aber! :-P

Haengt aber wohl vom Prozessor ab. Ich hab hier momentan einen 
M30620FCAP (M16C/62) in der mache wo es geht. Da steht auch nichts davon 
im Datenblatt das da was zurueckgesetzt wird.
Im Datenblatt zum M16C/28 steht es allerdings.

Aber trotzdem danke fuer den Tip, waer ich vermutlich in ein paar Wochen 
drauf reingefallen wenn ich da Code ruebergezogen haette.

Olaf

von Obelix X. (obelix)


Lesenswert?

Ich habe mal ein paar Datenblätter durchgeschaut. Überall habe ich das 
Verhalten des PCR2 Bit so gefunden wie von mir beschrieben.

Ich behaute einfach mal ganz frech ;-) , dass dein Code nur Zufällig 
funktioniert. (nicht böse gemeint)

PD9 ist nach einem Reset 0x00 -> alles Eingänge. Das erste Schreiben des 
PD9 wird richtig usgeführt und das "pd9_7 = 0" wirkt sich nicht negativ 
auf das Programm aus (bewirkt aber auch nichts).
Würde bei dir PD9 durch einen Zufall falsch sein funktioniert dein 
Programm nicht mehr richtig.

von Rudi (Gast)


Lesenswert?

@Obelix

> Ich behaute einfach mal ganz frech ;-) , dass dein Code nur Zufällig
> funktioniert. (nicht böse gemeint)

..recht hast du

Rudi

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.