PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Variablentyp von Ports und Pins



timpleton
18.10.2005, 15:22
Etwas komischer Titel, ich weiß...
Aber genau darum geht es:

Ich will in einem Programm eine Funktion verwenden, die als Parameter einen Port oder einen Pin bekommt.
Nur, von welchem Typ sind diese Parameter? Denn irgendwas muß ich da ja angeben.

Zum besseren Verständnis hier noch mal ein Beispiel:

int main (void){
...
tu_was_mit(PORTx);
...
mach_was_mit(PINy);
...
return(0);
}
Dazu muß ich dann ja die Funktionen irgendwie so anlegen:

void tu_was_mit (Port_Typ port);
void mach_was_mit (Pin_Typ pin);

Nur was muß da als Port_Typ bzw. Pin_Typ stehen?

Tim

kater
18.10.2005, 15:33
PORTS und PINS sind keine wirklichen Typen. Mehr ein synonym fuer Zahlen. Schau mal da vorbei:
http://www.avr-asm-tutorial.net/avr_de/beginner/ports.html#Was

SprinterSB
18.10.2005, 16:00
Du übergibst die Adresse der Ports:


void mach_was (volatile unsigned char*, unsigned char);

void mach_was (volatile unsigned char *pport, unsigned char pin)
{
// Setzt pin auf 1
*pport |= (1<<pin);
}

void main()
{
mach_was (&PORTB, 2);
}


Alternativ könnte man anstatt der Pin-Nummer schon eine Maske für der Zugriff übergeben.

Allerdings rate ich dir dringend von solchen Konstrukten ab, weil der generierte Code breit und langsam wird!

Eigentlich brauchst du so was auch nicht, weil du zur Compilezeit schon weisst, welcher Port wo liegt und welche Aufgaben er hat.

Wozu braucht man sowas???

timpleton
20.10.2005, 00:54
Danke für den Hinweis.
Ich habe das jetzt mal so übernommen und es funktioniert ganz gut.

Das der Code "breit und langsam" wird ist in meinem Fall nicht ganz so gravierend. Ich brauche das ganze für eine Spielerei, die mir seit einiger Zeit im Kopf rumspukt:
In einer 4x4 Matrix aus LEDs wird "per Zufall" eine LED ausgewählt, deren Zustand dann geändert wird. Allerdings soll die betroffene LED nicht bloß ein- oder ausgeschaltet werden, sondern wird per Software-PWM langsam in den anderen Zustand übergeblendet.
Dafür finde ich es ganz praktisch, Funktionen wie Einblenden(Port, Pin) und Ausblenden(Port, Pin) zu haben.

Oder geht das ganze noch eleganter und mit besserem Code?
Ich gebe ja zu, daß ich kein Programmierkönig bin und die Möglichkeiten und Methoden effktiver C-Programmierung erst noch lerne...

SprinterSB
20.10.2005, 15:22
'Besser' ist ja sehr relativ. Besserer Code was Laufzeit und/oder Codebreite angeht ist nicht unbedingt besser Code im Bezug auf Lesbarkeut oder Portierbarkeit. Die Pole stehen idR leider im krassen Gegensatz.

So mies ist die Lösung nun auch wieder nicht, aber man hat nun mal den Overhead von Funktionsaufruf, rumgeshifte und indirektem Portzugriff.

Alternativ könnte man so was machen, um 4 Bits auszugeben:

// Verwende PortB.1, PortB.3, PortC.3, PortD.2

#define PORT_0 PORTB
#define PBIT_0 1

#define PORT_1 PORTB
#define PBIT_1 3

#define PORT_2 PORTC
#define PBIT_2 3

#define PORT_3 PORTD
#define PBIT_3 2

void out_nibble (uint8_t nibble)
{
if (nibble & _BV(0)) PORT_0 |= _BV (PBIT_0); else PORT_0 &= ~_BV (PBIT_0);
if (nibble & _BV(1)) PORT_1 |= _BV (PBIT_1); else PORT_1 &= ~_BV (PBIT_1);
...
}

// Oder über ein Makro
// OUT_BIT (nibble,2); etc
#define OUT_BIT(var,bit) \
if ((var) & _BV(bit)) \
PORT_ ## bit |= _BV(PBIT_ ## bit); \
else \
PORT_ ## bit &= ~_BV(PBIT_ ## bit)

Ist jedenfalls fixer als über indirekte Portzugriffe, da musst da ja auch noch die Abbilding von Zufallszahl auf Port/Pin machen.

Was ähnliches hatte ioh auch mal vor, und zwar ein Nachbau von TIX LED Clock (http://www.thinkgeek.com/cubegoodies/lights/7437/). Bisher ist es daran gescheitert, passende Flächen-LEDs zu beschaffen. Ich müsste mir welche besorgen (nicht ganz billig die Teile), und für Farben wie grün oder blau aufbohren und mit beschliffenen 3mm LEDs neu bestücken. Pro selbstbestückter Flächen-LED ist man mit knapp 10€ dabei.
Blaue FLEDs hab ich noch nirgendwo gefunden. Rot, gelb und grün mit weiß-diffusem Gehäuse gibt's zB von Lumex und Kingbright. Distributor hab ich nur rs-Components ausmachen können. Reichelt hat ganau diese leider nicht :-)
Das normale LED-Grün (GaP) ist zudem recht fade, erinnert irgendwie an blassen Kopfsalat. Wenn man sattes Grün will (GaInN) muss man die grünen auch nachbestücken.

timpleton
21.10.2005, 18:06
Ich glaube, ich bleibe dann erstmal bei meiner Variante.
Denn für mich ist das im Moment noch wesentlich einfacher zu lesen.
Und wie gesagt, aufs Tempo kommt es bei meiner Anwendung erstmal nicht an und die Codegröße spielt auch nur eine untergeordete Rolle.

Diese LED Clock ist ein schickes Teil, kann man nicht anders sagen.
Wenn Du eh basteln willst, könntest Du dann nicht auf die FLEDs ganz verzichten und statt dessen eine Milchglasscheibe (kann ja auch mattiertes Acryl (CD-Cover oder so) sein...) mit LEDs beleuchten?
Ist vielleicht einfacher und günstiger zu bewerkstelligen.

SprinterSB
24.10.2005, 11:02
An Milchglas gab ich natürlich auch schon gedacht, allerdings an richtiges Glas. Da hab ich mehr Auswahl, es sieht besser aus und ich kann es viel besser bearbeiten. Für jede Stelle muss man ein kleines Glasplättchen schneiden und die einzelnen gegeneinander abschotten, um ein übersprechen von einem Plättchen an benachbarte zu unterbinden.

Die Flächen-LEDs sind allerdings ganz chic und pro 10mm FLED hat men 4 LEDs und eine ganz gleichmässig ausgeleuchtete Fläche.

Aber vorerst bin ich mit meiner Nixie-Uhr beschäftigt. Das Hochspannungsnetzteil hab ich fertig, Layout, Schaltplan, Routinen und Design auch fast fertig :-)