Hallo
brauche Tips für ein Programm in C für C515 von Infineon.
Benutze die Keil-Sofware zum simulieren.
Habe 2 Ports (P3.4 und P3.5) die als Digitaleingänge benutzt werden sollen, muss jetzt ein Signal auf die Eingänge geben und sie dann wieder einlesen.
Da mein C nicht ganz so gut ist ,bräuchte ich ein paar Hilfestellungen fürs programmieren.
Vielen Dank
Programmieren - alles kontrollieren 4.941 Themen, 20.708 Beiträge
Ich hab zwar nur Erfahrung mit dem SAB C165 von Infineon, vielleicht kann
ich dir ja trotzdem helfen.
Meistens gibt es (muss aber nicht sein) ein Direction Port Register DPx.x, dort kannst
du die Richtung des Ports einstellen (Input/Output Port). Heisst also: wenn
du das 4.Bit des 5. Ports (P3.5) im DP3.5 als Eingang einstellst, so kannst du
dieses Bit nur als Eingang benutzen. (Und umgekehrt im Output modus)
Kann aber auch sein dass du beim C515 Ports gleichzeitig als In und Output verwenden kannst.
Da würde ich mal die Doku von deinem Controller zu rate ziehen. (Da steht diese ganze Sache auch haarklein beschrieben)
Wenn diese Sache geklärt ist (I/O Geschichte), dann kannst du diese 2 Bits (4/5) mittels
sbit (Special Function Register Bit) definieren:
sbit P3.5 DiesistBitFünfvonP3;
sbit P3.4 DiesistBitViervonP3;
Damit hast du also die Bits P3.5 und P3.4 als "DiesistBitFünfvonP3" und "DiesistBitViervonP3" definiert, heisst du kannst mit ihnen in C so umgehen
als wären sie normale boolsche Variablen (1 und 0 - Zustand high/low - Strom da, nicht da)
So kannst du dann zum Beispiel damit umgehen:
DiesistBitFünfvonP3 = DiesistBitViervonP3;
Damit weist du P3.5 den aktuellen Wert von P3.4 zu. Wenn P3.4 also momentan high ist, legt dein Controller am P3.5 auch high an usw.
Also als wären es ganz normale Variablen.
Vielleicht konnt ich dir helfen, die beste hilfe bietet dir aber sicherlich
die Doku deines Controllers und des Keil Compilers :)
Gruss IDE-ATAPI
Hallo Piett,
mir ist zwar nicht so ganz klar, was Du machen willst,
aber vielleicht kannst Du mit folgendem Beispiel-Code was anfangen.
Ich habe das von Keil mitgelieferte Beispielprojekt "hello.uv2"
ein wenig abgeaendert.
Uebrigens sind die Ports P3.4 und P3.5 bidirektional. Sie koennen somit
als Ein- oder Ausgaenge verwendet werden. Beim 8051 gibt es zur Konfiguration
der Richtung(Ein- oder Ausgang) der Ports keine Einstellmoegichkeiten ueber ein
Direction Register, wie es beim C166 der Fall ist.
Die Ports P3.4 und P3.5 koennen als spezielle Eingaenge benutzt werden,
die mit Timer0 bzw. Timer1 verknuepft werden koennen. Die Timer bzw. Counter
zaehlen dann die Anzahl der 1/0 Uebergange.
In meinem Beispiel-Code habe ich nur Port P3.4 mit Timer0 verknuepft,
da Timer1 beim Debuggen ueber die serielle Schnittstelle verwendet wird.
Im Simulator kannst Du dann im Menue "Peripherals/IO-Ports/Port3" die Eingaenge
der Ports aendern. Mit printf werden dann die Ports im Ausgabefenster,
dass Du im Menue "View/Serial Window1" aktivieren jannst, ausgegeben.
#include <reg515.h>
#include <stdio.h>
sbit p3_4=P3^4;
sbit p3_5=P3^5;
void main (void)
{
/*------------------------------------------------
Setup the serial port for 1200 baud at 16MHz.
------------------------------------------------*/
#ifndef MONITOR51
SCON = 0x50; /* SCON: mode 1, 8-bit UART, enable rcvr */
TMOD |= 0x20; /* TMOD: timer 1, mode 2, 8-bit reload */
TH1 = 221; /* TH1: reload value for 1200 baud @ 16MHz */
TR1 = 1; /* TR1: timer 1 run */
TI = 1; /* TI: set TI to send first char of UART */
#endif
/*
** Timer 0 initialisieren
** Timer 0 kann als Counter benutzt werden.
** der jedesmal wenn Port 3.4 von 1 auf 0 geht,
** hochgezaehlt wird
*/
TMOD &= 0xF0; // Timer 0 als 16 Bit Counter benutzen
TMOD |= 0x05;
TH0 = 0; // Timer 0 ruecksetzen
TL0 = 0;
TR0 = 1; // Timer 0 starten
while (1)
{
// Port P3.4, P3.5 und Timer0 ausgeben
printf("P3.4:%02bX,P3.5:%02bX,TH0:%02bX,TL0:%02bX\n",
(unsigned char)p3_4,(unsigned char)p3_5,TH0,TL0);
}
}
Danke Bon für die MHilfe und die Mühe die du dir machst.
Was muss ich machen um auch P3.5 anzeigen zu lassen ? (Habe auch im Simulator bei Peripherals/... verstellt aber nichts, oder hab ich das falsch verstanden!!!)
Vielen Dank
Hallo Piett,
ich verstehe Dein Problem nicht ganz.
Wird der Port 3.5 mit printf() nicht richtig ausgegeben,
wenn Du den Port im Simulator aenderst, oder was genau ist Dein Problem ? Kannst Du mir naeher beschreiben, was nicht funktioniert ?
Uebrigens habe ich die Verknuepfung von Port 3.4 mit Timer0 als Counter zuerst mit uVision Version 2.0 probiert. Mit dieser Version hats nicht geklappt. Mit der aktuellen Version 2.37 funktioniert es nun.
Gruss
Bon
Wenn ich das Programm gestartet habe, wird im Fenster nur P3.4 angezeigt.
Was muss ich tun das auch P3.5 oder beide zusammen angezeigt werden.
Danke