-
        

Ergebnis 1 bis 7 von 7

Thema: Variablentyp von Ports und Pins

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    10.05.2005
    Beiträge
    7

    Variablentyp von Ports und Pins

    Anzeige

    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:
    Code:
    int main (void){
    ...
    tu_was_mit(PORTx);
    ...
    mach_was_mit(PINy);
    ...
    return(0);
    }
    Dazu muß ich dann ja die Funktionen irgendwie so anlegen:
    Code:
    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

  2. #2
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    01.08.2005
    Ort
    49.80248 8.59252
    Alter
    33
    Beiträge
    172
    PORTS und PINS sind keine wirklichen Typen. Mehr ein synonym fuer Zahlen. Schau mal da vorbei:
    http://www.avr-asm-tutorial.net/avr_...ports.html#Was

  3. #3
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.801
    Du übergibst die Adresse der Ports:
    Code:
    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???
    Disclaimer: none. Sue me.

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    10.05.2005
    Beiträge
    7
    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...

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.801
    '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:
    Code:
    // 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. 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.
    Disclaimer: none. Sue me.

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    10.05.2005
    Beiträge
    7
    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.

  7. #7
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.801
    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
    Disclaimer: none. Sue me.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •