PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [gelöst] Idee und Problem...



squelver
11.10.2008, 21:32
Hallo :)

Ich bin seit gestern wieder am üben. Nun hab ich mir was ausgedacht, soweit klappt, nur gibts ein kleines Problem.

Ich nutze einen Port für eine Segmentanzeige. Habe aber nur 5 Pins zur Verfügung. Ich habe jede Zahl definiert. Nun fehlen mir zwei Pins eines anderen Ports für die vollständige Anzeige der Zahlen. Kann man zwei Ports gleichzeitig definieren?

Hier mein Code:


//----------------------------------------------------------------------
// Titel : C Grundgerüst für das myAVR-Board
//----------------------------------------------------------------------
// Funktion : Skorpion-Roboter "Intelligentes Bein"
// Schaltung : ...
//----------------------------------------------------------------------
// Prozessor : ...
// Takt : 3.6864 MHz
// Sprache : C
// Datum : 10.10.2008
// Version : 0.1
// Autor : copious
//----------------------------------------------------------------------
#define F_CPU 3686400 // Taktferquenz des myAVR-Boards

#define zahl PORTB // Port
#define eins 0b00100001 // 1
#define zwei 0b00111110 // 2
#define drei 0b00111011 // 3
#define vier 0b00110001 // 4
#define fuenf 0b00011011 // 5
#define sechs 0b00011111 // 6
#define sieben 0b00100011 // 7
#define acht 0b00111111 // 8
#define neun 0b00111011 // 9
#define null 0b00101111 // 0
#define off 0b00000000 // aus

#include <avr\io.h> // AVR Register und Konstantendefinitionen
//----------------------------------------------------------------------
main () // Hauptprogramm, startet bei Power ON und Reset
{
DDRD = 0b11111100; // Pin 2 - 7 (Ausgang)
DDRB = 0b00111111; // Pin 0 - 5 (Ausgang)
DDRC = 0b00000110; // Pin 0 - 5 (Eingang)
PORTC = 0b00000110;

do
{
if(!(PINC&0b00000010))
{
zahl = eins;
}
else if(!(PINC&0b00000100))
{
zahl = zwei;
}
else
{
zahl = off;
}

}
while (true); // Schleifenende Mainloop
}
//----------------------------------------------------------------------

uwegw
11.10.2008, 22:46
gelöst oder nicht?


Erst mal würde ich die Muster nicht als defines, sondern in einem Array ablegen. Dann kann man nämlich zb mit anzeigecodes[7] die Code für die sieben ermitteln, wodurch die Ausgabe von Variablen erst möglich wird. Mit deiner Lösung könntest du nur konstante Wert ausgaben, da du alle Zahlen ausschreiben musst.

Und dann solltest du eine Funktion schreiben, die die Zahl als uint8 übergeben bekommt und dann den Code nachschaut und die Ports entsprechend setzt.

In dieser Funktion müsste dann das Byte mit dem Code aufgeteilt werden, und dann auf die Ports geschreiben werden.

squelver
11.10.2008, 22:51
Danke für den Tipp, ich bin nur am rumprobieren und testen, ist nicht das direkte Ziel ne Segmentanzeige zu betreiben :)
Wie sich was verhält und so.

Des ist mein aktueller Code, sicherlich einiges so wie es nicht sein sollte, aber es funzt, die Zahlen laufen durch von 0 bis 9:


//----------------------------------------------------------------------
// Titel : C Grundgerüst für das myAVR-Board
//----------------------------------------------------------------------
// Funktion : Skorpion-Roboter "Intelligentes Bein"
// Schaltung : ...
//----------------------------------------------------------------------
// Prozessor : ...
// Takt : 3.6864 MHz
// Sprache : C
// Datum : 10.10.2008
// Version : 0.1
// Autor : copious
//----------------------------------------------------------------------
#define F_CPU 3686400 // Taktferquenz des myAVR-Boards

// #define zahl PORTB // Port
#define eins (PORTD = 0b10000100) & (PORTB = 0b00000010) // 1
#define zwei (PORTD = 0b11111000) & (PORTB = 0b00000010) // 2
#define drei (PORTD = 0b11101100) & (PORTB = 0b00000010) // 3
#define vier (PORTD = 0b11000100) & (PORTB = 0b00000011) // 4
#define fuenf (PORTD = 0b01101100) & (PORTB = 0b00000011) // 5
#define sechs (PORTD = 0b01111100) & (PORTB = 0b00000011) // 6
#define sieben (PORTD = 0b10001100) & (PORTB = 0b00000010) // 7
#define acht (PORTD = 0b11111100) & (PORTB = 0b00000011) // 8
#define neun (PORTD = 0b11101100) & (PORTB = 0b00000011) // 9
#define null (PORTD = 0b10111100) & (PORTB = 0b00000011) // 0
#define off (PORTD = 0b00000000) & (PORTB = 0b00000000) // aus

#include <avr\io.h> // AVR Register und Konstantendefinitionen
#include <util\delay.h> // Bibliothek mit Warteroutinen
//----------------------------------------------------------------------

main (void) // Hauptprogramm, startet bei Power ON und Reset
{
DDRD = 0b11111100; // Pin 2 - 7 (Ausgang)
DDRB = 0b00111111; // Pin 0 - 5 (Ausgang)
DDRC = 0b00000000; // Pin 0 - 5 (Ausgang)
PORTC = 0b00000011;

unsigned char i; // Variable für Datenausgabe
i=1; // Bit 0 = 1, 0b00000001

do
{


if (eins) // Wenn Bit durchgelaufen
i;
_delay_ms(10000); // kurz warten
if (zwei)
i;
_delay_ms(10000); // kurz warten
if (drei)
i;
_delay_ms(10000); // kurz warten
if (vier)
i;
_delay_ms(10000); // kurz warten
if (fuenf)
i;
_delay_ms(10000); // kurz warten
if (sechs)
i;
_delay_ms(10000); // kurz warten
if (sieben)
i;
_delay_ms(10000); // kurz warten
if (acht)
i;
_delay_ms(10000); // kurz warten
if (neun)
i;
_delay_ms(10000); // kurz warten
if (null)
i;
_delay_ms(10000); // kurz warten

}
while (true); // Schleifenende Mainloop
}
//----------------------------------------------------------------------