Durch Tastendrucke + 7 Segment Ports Schalten

Hi Finn,

Mit delays kann ich entprellen, dass bekomme ich hin. Nur ich möchte eine schönere Variante finden, damit der Controller keine Rechenzeit verschwendet.
Ohne verschwendung von Rechenzeit bleibt eigentlich nur eine ISR
(Interrupt Service Routine) oder mein Schieberegister übrig. Wobei ich
nicht weiß ob du für Interrupts schon fit genug bist. Da ist man mannchmal
ganz schön am grübeln (selbst ich noch).

Interrupts arbeiten unabhängig vom programmierten Ablauf. Die werden
also irgendwan von der Hardware angestoßen und reißen den Prozessor
aus seiner normalen Arbeit die du programmiert haßt raus. Dann wird erst
mal die ISR abgearbeitet und danach gehts an der Stelle weiter, wo er
rausgerissen wurde. Wenn das an der Stelle passiert, wo du zB für
bestimmte Impulslängen auf einem Ausgang ne Warteschleife programmiert
hast dann ändert sich dadurch auch die Wartezeit und damit die
Impulslänge (die Laufzeit der ISR kommt ja logischerweise dazu). Bei
meiner LCD-Ausgabe hab ich dadurch beim ersten Versuch total wirre
Zeichen auf dem Display gehabt wie ich ne Taste gedrückt habe.

Das mit dem Schieberegister ist da schon einfacher (überschaubarer).
Du fragst bei jedem Durchlauf der Hauptschleife die Pins mit den Tasten
ab. Wenn der Pin 1 ist dann schiebst Du ne 1 in das Register für die Taste
rein und wenn der Pin 0 ist dann eben ne 0. Das ist wie ne Eimerkette
beim Feuerlöschen wo du mal volle und mal leere Eimer reinreichst.
Wenn das Register dann 8 Einsen drin hat dann wurden bei 8 Durchläufen
ne 1 am Pin gelesen und wenn Du 8 Nullen drin hast dann wurde 8x
ne 0 am Pin gelesen. Dir Zeit, die du sonst für Warten verschwendet
hast kann der Proßzessor dann was anderes in der Hauptschleife machen.
Du hast also eigentlich eine Wartezeit zwischen den Abfragen die so lang
ist, wie die Abarbeitung des restlichen Krams in der Hauptschleife dauert.
Also eine mit Arbeit gefüllte Wartezeit ;)

Gruß
Dino
 
Ohne verschwendung von Rechenzeit bleibt eigentlich nur eine ISR
(Interrupt Service Routine) oder mein Schieberegister übrig.

Naja! Es ist aber nicht so dass es nur die 2 Möglichkeiten gibt das Ganze ohne verschwendete Rechenleistung durchzuziehen. Ich hab in diesem Thread gezählte 6 mal eine andere Möglichkeit aufgesagt(immer die Selbe) und es gibt noch unendlich(soviel wie halt der Programmspeicher zulässt) viele andere. Von mir aus kann er es auch mit einer Delay machen, nur muss er sich dann im Klaren darüber sein, dass immer dann wenn er eine Taste drückt eine der 3 Siebensegmentanzegen kurz mal leicht aufblitzt. Kani soll das machen was er sich am lebhaftesten vorstellen kann.

Und Verschwendung? Ist es nicht so dass die verbrauchte Energie nicht irgendwie nur in Informationsenergie umgewandelt wird? :D Es würde mich jedenfalls interessieren wer sowas glaubt.
 
Hey, dass mit den ISRs und den Registern kann ich mir am besten vorstellen.
Ich probiere das mal aus und gebe meldung. Eure antworten waren sehr hilfreich, danke!
 
Hi Finn,

Hey, dass mit den ISRs und den Registern kann ich mir am besten vorstellen.
na denn mal fröhliches basteln :rolleyes:
Dann leg schon mal 2 Dioden von den Pins mit den Tastern zum INT0 oder INT1
damit der Prozessor überhaubt nen Interrupt beim Tastendruck bekommt. Der
8515 unterstützt nämlich leider keinen PinChangeInterrupt :(

Hast Du dir im Datenblatt des 8515 schon mal die Sachen mit externen
Interrupts, Interrupt-Vektoren, Rücksprung aus Interrupt-Routinen, An- und
Abschalten von Interrupts, Interrupt-Prioritäten und Interruptmasken
durchgelesen ?? und auch verstanden ???

Das steht nochmal ein paar Ebenen über einer Multiplex-Anzeige ;) Ich hoffe
wirklich, du weißt auf was Du dich da einläßt :D

Weißt Du was ein Interrupt bei einem Prozessor bewirkt ? Wenn ja, dann
herzlichen Glückwunsch :) Dann wünsch ich dir viel Spaß. Wie das in C
zu programmieren geht ??? Da kann ich dir überhaupt nicht weiterhelfen.
Ich mach das nur in Assembler. Da kenn ich das gut genug.

Nicht das ich dich davon abhalten will. Aber man sollte langsam anfangen.
Ich will auch nicht dein Wissen anzweifeln. Ich weiß nur im Moment nicht,
wie weit Du dich wirklich mit dem Thema auseinandergesetzt hast.

Gruß
Dino
 
Im moment weiß ich noch nicht viel darüber. Habs nur einmal durchgelesen und nochmal überflogen. Vllt. mache ich auch erst die Methode mit den Schieberegistern.
Da brauch ich nicht noch mehr Hardware :p
 
Hi Finn,

Im moment weiß ich noch nicht viel darüber. Habs nur einmal durchgelesen und nochmal überflogen. Vllt. mache ich auch erst die Methode mit den Schieberegistern.
Da brauch ich nicht noch mehr Hardware :p
Bei Interrupts mußt Du dir bei der Programmierung im klaren sein, das die
InterruptServiceRoutinen (ISRs) nicht durch dein Programm aufgerufen
werden sondern durch die Hardware. Das kann zu jedem Zeitpunkt in deinem
normalen Programmablauf passieren. Du mußt also dein normales Programm
und auch deine ISRs darauf auslegen, das sie bestimmte Systemzustände
und Informationen sichern und nach der Ausführung der ISR wieder herstellen
können.

Das sind in meinem Fall in Assembler z.B. das Statusregister mit den Flags
(Carry, Zero, ...) und die Register die in der ISR selber verwendet werden.
Denn es kann Dir ja passieren, das der Interrupt zuschlägt wenn Du gerade
zwei Register auf Gleichheit testest. Das Ergebnis von dem Test ist dann im
Statusregister. Und bevor der bedingte Sprung diese Informationen auswerten
kann reißt ihn der Interrupt aus dem Ablauf. Wenn die ISR diesen Status
danach nicht wieder herstellen kann, dann macht der bedingte Sprung evtl
nicht das, was er dem Test nach vor Ausführung des Interrupts eigentlich
machen sollte.

Das wird dann ziemlich haarig bei der Fehlersuche. Weil der Quellcode
eigentlich gut aussieht, das Programm aber manchmal nicht das macht was
es soll oder der ganze Kram Amok läuft.

Ok, jetzt hab ich aber lange genug über Interrupts gequatscht :rolleyes:

Zu den ganzen Schieberegister-Kram ...

Bei C mußt Du wohl für jede Taste eine ganzzahlige Byte-Variable definieren.
Bei jedem Durchlauf der Hauptschleife extrahierst du nun von jeder der beiden
Tasten nur dieses eine Bit von dem Port, an dem die Taste hängt. Dieses
Bit wird dann von rechts (also in das niederwertigste Bit) in die Variable geschoben.

Das sieht dann z.B. folgendermaßen aus ...

Durchlauf - Variable Tast1 - Taster-Pin
Nummer 01 - 00000000 <--- 0 ... alles auf 0
Nummer 02 - 00000001 <--- 1
Nummer 03 - 00000010 <--- 0
Nummer 04 - 00000101 <--- 1
Nummer 05 - 00001010 <--- 0
Nummer 06 - 00010101 <--- 1
Nummer 07 - 00101011 <--- 1
Nummer 08 - 01010111 <--- 1
Nummer 09 - 10101111 <--- 1
Nummer 10 - 01011111 <--- 1
Nummer 11 - 10111111 <--- 1 ... noch nicht alles einheitlich - es prellt noch
Nummer 12 - 11111111 <--- 1 ... alles auf 1 und das Prellen beendet
Nummer 13 - 11111111 <--- 1 ... immer noch alles 1
Nummer 14 - 11111110 <--- 0 ... Taste ändert wieder den Zustand
Nummer 15 - 11111100 <--- 0
Nummer 16 - 11111000 <--- 0

Gruß
Dino
 
Ich habe beides verstanden. Ich denke ich fange mit den Bits in Register schreiben an.
Da schaut der Controller ja nur, ob der Taster x viele Schleifendurchläufe den gleichen Wert rausgibt. Wenn er das Tut, ist der Taster entweder entprellt oder halt noch am Prellen. (Je nach dem, ob 1 oder 0).

Das bekomme ich hin, denke ich.
 
Ähm? Dino? Ich glaub Kani hat das mit dem Schieberegister schon vorher kapiert. Wir sollten uns auserdem darauf einigen dem Kani nicht jeden Algorithmus oder gar Code hinterherwerfen, er sollte das selber lernen.
Deine Erläuterungen zu interrupts find ich aber durchaus wichtig, vorallem da ich das was hinter einem Funktionsaufruf oder Interrupt steckt erst während meinem kleinen Assemblerausflug richtig verstanden habe.

:offtopic:
Wie wir im Chat schon diskutiert haben, bin ich dafür dass wir uns generell, eine für Neueinsteiger mit solchen Projekten, höfliche aber für beide Parteien nervensparende Strategie überlegen. Es ist meiner Meinung nach unhaltbar dass ein absoluter Neuanfänger von gutgesinnten Leuten einfach durch ein Welteroberungsmaschienenprojekt geführt werden, wie ein Blinder von einem Blindenhund.
So ein Forumsuser ist nun mal kein Blindenhund, er will nicht jeden Neuankömmling an der Nase durch sein Großprojekt zerren, er will sich mit Projekten in seinem Interessensbereich und den sich selbst auferlegten Hürden weiterentwickeln.
Auch darf der Blinde...äh Neuuser meine ich sich selbst nicht zuviel auf einmal abverlangen, sofort ein Display in Betrieb nehmen oder als erstes gleich mal eine Propelleruhr aufbauen ist nicht drinnen. Selbst die Profis haben klein angefangen, sehr klein, da wird als erstes nur ein Led Leuchten abhängig davon ob eine Taste gedrückt war, danach kommt villeicht(wenn er schon mal auf PCs programmiert hat) ein Lauflicht und so weiter.
Wenn hier Jemand mit einer Fertig programmierten und Gemultiplexten 7 Segmentanzeige steht und fragt wie man Taster entprellt ist irgendwo etwas schiefgegangen. Entprellen ist nämlich die 3te Sache die man auf einem AVR ausprobiren sollte:
1)Wenn Taster dann LED
2)Wenn taster dann toggelt LED(da wird man auf das Prellen aufmerksam)
3)2. mit Entprellung.
Nebenbeibemerkt hätte es der alteingesessenen Forumuser leichter gehabt wenn er keinem Neuling jedes Codeschnipsel aus der Nase ziehen hätte müssen, sonern wenn er das Projekt alleine durchgezogen hätte und es dem Neuling danach unter Erstattung der Arbeitszeit und Materialkosten überlassen hätte.



@Kani: Nimms mir nicht über aber Anfangs wusste ich wirklich nicht was ich mir mit dir aufgeladen habe.(so schlimm wie oben beschrieben warst du natürlich nicht)

@Die Anderen: Um nicht zu klingen wie Jemand der sich auf freiwilliger Basis etwas auflädt und nachher jammert will ich sagen dass ich beispielweise schon mitgelesen habe, dass Markus jemandem bei einem Bascomproblem geholfen hat dass selbst ich als Bascomverweigerer zusammengebracht hätte.
 
Hi Nomis,

Ähm? Dino? Ich glaub Kani hat das mit dem Schieberegister schon vorher kapiert. Wir sollten uns auserdem darauf einigen dem Kani nicht jeden Algorithmus oder gar Code hinterherwerfen, er sollte das selber lernen.
Ich wollte es nur noch mal ABSOLUT SICHER UND UNMISSVERSTÄNDLICH
klarstellen was ich da gemeint habe :D :D :D

Deine Erläuterungen zu interrupts find ich aber durchaus wichtig, vorallem da ich das was hinter einem Funktionsaufruf oder Interrupt steckt erst während meinem kleinen Assemblerausflug richtig verstanden habe.
stimmt absolut. So richtig versteht man Interrupts erst in Assembler. Da
sieht man, was der Prozessor da eigentlich im einzelnen macht.

-- Oh Gott, dieses böse Wort - Off Topic :rolleyes: --
:offtopic:
Wie wir im Chat schon diskutiert haben, bin ich dafür dass wir uns generell, eine für Neueinsteiger mit solchen Projekten, höfliche aber für beide Parteien nervensparende Strategie überlegen. Es ist meiner Meinung nach unhaltbar dass ein absoluter Neuanfänger von gutgesinnten Leuten einfach durch ein Welteroberungsmaschienenprojekt geführt werden, wie ein Blinder von einem Blindenhund.
Das ist das größte Problem an Neueinsteigern. Sie sehen ein Projekt und
meinen "Das will ich auch machen - das ist cool" und vergessen dabei die
Arbeit und das KnowHow, das der andere dafür benötigt hat. Und ohne
notwendige Grundkenntnisse versucht er sich dann an dem Projekt, scheitert
evtl kläglich, ist frustriert und das ist ja sowieso alles große Sch...e und so.

Auch darf der Blinde...äh Neuuser meine ich sich selbst nicht zuviel auf einmal abverlangen, sofort ein Display in Betrieb nehmen
Damit ist jetzt aber nicht der User "Neuuser" gemeint :D

Selbst die Profis haben klein angefangen, sehr klein, da wird als erstes nur ein Led Leuchten abhängig davon ob eine Taste gedrückt war, danach kommt villeicht(wenn er schon mal auf PCs programmiert hat) ein Lauflicht und so weiter.
Genau so ist es. Vor dem Erfolg liegt der Schweiß. Und manchmal ist es
sehr viel Schweiß (stink, müff, was riecht hier so ?):D

Wenn hier Jemand mit einer Fertig programmierten und Gemultiplexten 7 Segmentanzeige steht und fragt wie man Taster entprellt ist irgendwo etwas schiefgegangen. Entprellen ist nämlich die 3te Sache die man auf einem AVR ausprobiren sollte:
1)Wenn Taster dann LED
2)Wenn taster dann toggelt LED(da wird man auf das Prellen aufmerksam)
3)2. mit Entprellung.
Wenn sich denn alle Anfänger dran halten würden (Himmel hilf!) ;)

Nebenbeibemerkt hätte es der alteingesessenen Forumuser leichter gehabt wenn er keinem Neuling jedes Codeschnipsel aus der Nase ziehen hätte müssen, sonern wenn er das Projekt alleine durchgezogen hätte und es dem Neuling danach unter Erstattung der Arbeitszeit und Materialkosten überlassen hätte.
Manchmal würde man vor lauter "Hand vor die Stirn schlagen" liebend gern
das Teil selber zusammenprogrammieren und dann : ...

"Is fertig. Hier da haste denn Brocken. Friß oder stirb."

Es gehören schon ein paar Grundlagen zum Basteln und Programmieren.
Bei einem Haus baut man ja auch nicht zuerst das Dach. Das vergessen
manche leider allzu oft.

So jetzt aber Schluß mit Off-Topic sonst muß ich mir noch selber die
gelbe Karte geben :rolleyes:

Gruß
Dino
 
Hallo ihr beiden ,

Dino, nichts sagen.
Was denkst du Kani?
Mal selber das Hirn zermartern lassen :D

Ich weiß was ihr meint. Ich werde auch erstmal alleine weiter machen und mich gelegentlich melden. Nur ausprobieren ohne überhaupt sicher zu sein, dass die Hardware funktioniert ist einfach nicht drin. Das ist jetzt ja geschafft.

Liege ich mit der Bitmanipulation richtig?
http://www.mikrocontroller.net/articles/Bitmanipulation
Bitmanipulation in C ist aber ganz schön kryptisch :rolleyes:
Da finde ich das lsl und lsr oder rol oder ror in Assembler einfacher :D

@Kani : Na denn fröhliches Nachdenken. Kannst uns ja mal deine
Gedankengänge mitteilen.

Bitmanipulation ist schon mal der erste Schritt in die richtige Richtung.
Aber dann ... :rolleyes: (man bin ich fies :D bin ich wirklich fies ? :rolleyes: )

Gruß
Dino
 
@Nomis:
Dino, nicht sagen.
Was denkst du Kani?
Hätte ich es vorgeschlagen, wenn ich es nicht für sinnvoll gehalten hätte?
Ich denke nicht.
Zu der DMX-Adresse und den Kanälen...es muss übrigens doch if(zaehlwert>512){zaehlwert=1;} heißen...es gibt das DMX512 und DMX1024-Protokoll.
512 Kanäle sind ein Universe.
Jeder Kanal hat 255 Werte bzw. Einstellungsmöglichkeiten.
Die Adresse 0 gibt es nicht! Sonst müsste es ja DMX513 heißen.
 
Ja! Aller Anfang ist schwer. Wenn man anfängt (ich habe übrigens auch als erstes Lauflichter programmiert) und Tutorials durchrattert ohne die aktiv zu testen, vergisst man viel. Ist halt nur Theoretisch. Man kann nicht alles behalten bei dem ersten mal.
Dass AVR-GCC Tutorial auf mikrocontroller.net fasst 88 DinA4 Seiten.
Aber so langsam weis ich, worauf es ankommt.
 
Hi Finn,

Zu der DMX-Adresse und den Kanälen...es muss übrigens doch if(zaehlwert>512){zaehlwert=1;} heißen...es gibt das DMX512 und DMX1024-Protokoll.
512 Kanäle sind ein Universe.
Jeder Kanal hat 255 Werte bzw. Einstellungsmöglichkeiten.
Die Adresse 0 gibt es nicht! Sonst müsste es ja DMX513 heißen.
Da hast Du wohl recht :D
Nun aber was anderes : Wieviel Bit benötigst Du von ...
a) 0...511 ?
b) 1...512 ?
Als Denkanstoß :D Sparmaßnahme läßt grüßen :D

Gruß
Dino
 
Ich musste mir erstmal klar werden, was der unterschied byte und bit ist.
Also ein bit ist das kleinste was es gibt. (0 oder 1)
8 bits sind ein byte.
Warum 8? 2 hoch 8 sind 256. Das sind doch alle ASCII-Zeichen oder?
Hängt das damit zusammen?

Wieviel Bit benötigst Du von ...
a) 0...511 ?
b) 1...512 ?

a)
Naja, also es sind ja 512 "Stufen". Jede Stufe hat 256 (0 bis 255) "unterstufen". Also gehe ich mal von 131072 bits. Das ist aber dann schon 16bit oder?
In der Lichttechnik Szene gibt es z.B. Moving Heads mit 8 und 16bit Steuerung. Die Schrittmotoren für die Bewegung (Genannt Pan (der Arm) und Tilt(der Kopf)) haben bei einem 8bit Moving Head nur einen Kanal von 0-255 Werte für meist bei Pan 540°. Diese 540° gibt es aber nur einmal.
Bei 16bit gibt es für jeden einzelnen Pan-Kanal noch einen (meist) Pan-Fine Kanal, der jeden Wert nochmal in 256 Schritte unterteilt.
Also passt demnach meine Rechnung nicht. Oder?

b) Wenn es dasselbe wäre, würdest du nicht fragen oder? Bin aber trotzdem der Meinung, dass es das Theoretisch (wenn es den Kanal 0 geben würde) das gleiche wäre.
 
Hi Finn

Ich musste mir erstmal klar werden, was der unterschied byte und bit ist.
Also ein bit ist das kleinste was es gibt. (0 oder 1)
8 bits sind ein byte.
Warum 8? 2 hoch 8 sind 256. Das sind doch alle ASCII-Zeichen oder?
Hängt das damit zusammen?
Das hab ich jetzt freundlicherweise mal überlesen :eek: :eek: :rolleyes:

a)
Naja, also es sind ja 512 "Stufen". Jede Stufe hat 256 (0 bis 255) "unterstufen". Also gehe ich mal von 131072 bits. Das ist aber dann schon 16bit oder?
In der Lichttechnik Szene gibt es z.B. Moving Heads mit 8 und 16bit Steuerung. Die Schrittmotoren für die Bewegung (Genannt Pan (der Arm) und Tilt(der Kopf)) haben bei einem 8bit Moving Head nur einen Kanal von 0-255 Werte für meist bei Pan 540°. Diese 540° gibt es aber nur einmal.
Bei 16bit gibt es für jeden einzelnen Pan-Kanal noch einen (meist) Pan-Fine Kanal, der jeden Wert nochmal in 256 Schritte unterteilt.
Also passt demnach meine Rechnung nicht. Oder?

b) Wenn es dasselbe wäre, würdest du nicht fragen oder? Bin aber trotzdem der Meinung, dass es das Theoretisch (wenn es den Kanal 0 geben würde) das gleiche wäre.

???????? Hhhääääääääääää ????????? Verwechselst Du im Moment nicht
Äpfel und Birnen ???
Willst Du auf dem DMX-Bus jetzt Adressieren oder Daten übertragen ???????
Also nochmal
a) 0...255 sind 256 mögliche Zustände und dafür braucht man x Bits
b) 0...511 sind m mögliche Zustände und dafür braucht man y Bits
und jetzt ACHTUNG !! genau denken !!!
c) 1...512 sind n mögliche Zustände und dafür braucht man z Bits

Und ich krieg gleich auch nen Zustand :D

Gruß an die kleinen grauen Dinger im Kopf ;)
Dino
 
a) 0...255 sind 256 mögliche Zustände und dafür braucht man x Bits
b) 0...511 sind m mögliche Zustände und dafür braucht man y Bits
und jetzt ACHTUNG !! genau denken !!!
c) 1...512 sind n mögliche Zustände und dafür braucht man z Bits
Das war mir klar.
Aber von Kanal 1 bis 512 gibt es 130560 Mögliche Zustände. Wenn man nicht nur die Kanäle (die im Endeffekt ja "nichts" machen) sondern ihre Werte mit einbezieht.
 
Code:
/* DMX-Adressengeber
Version: 0.1
Datum: 027.02.2009
Autor: Finn 'Kani' Schürmann
Target: AtMega 8515
Lizenz: Keine
*/

#include <avr/io.h>
#include <util/delay.h>

#define F_CPU 1000000UL

int main (void)
{
    DDRC = 0b11111111;  // Alles auf Ausgang - Das sind die  Segmente
    DDRA = 0b00000111;  // PA0-2 auf Ausgang - Das sind die Transistoren
    PORTC = 0b00000000; // Alles auf Low da die Segmente die Kathoden sind
    PORTA = 0b11111111;  // Das schaltet den PNP-Transistor an PA7 ein
    
    
    //Variablen definieren

    unsigned char ziffer=0;
    int zaehlwert=0;
    unsigned char letztetastenposition1,letztetastenposition2;
    int stelle1,stelle2,stelle3;
    unsigned char stellezwischenschritt;
    unsigned char seg[] =
        {
        0b11100111,//0
        0b10000100,//1
        0b11010011,//2
        0b11010110,//3
        0b10110100,//4
        0b01110110,//5
        0b01110111,//6
        0b11000100,//7
        0b11110111,//8
        0b11110110,//9
        };
    
    while(1)
    {
        _delay_ms(3);        //While-Schleife verlangsamen damit die Transistoren nicht zu oft schalten
        
        ziffer++;

        //Taster 1 (Up)

        entprellung ( (uint8_t*)&PINA, (1<<PINA6) );
        
        if( ! (PINA & (1<<PA6) ))        //Wenn Up-Taster gedrüct ist
        {
                if( ! letztetastenposition1)    //
                {
                    zaehlwert++;            //Zaehlwert einen hoch. 100 => 101
                }
            letztetastenposition1=1;            
        }
        else
        {    
            letztetastenposition1=0;    //Taster bei letztem Schleifendurchlauf nicht gedrückt
        }
            //Taster 1 ENDE
        
        //Taster 2 (Down)
        
        entprellung( (uint8_t*)&PINA, (1<<PINA7) );
        
        if( ! (PINA & (1<<PA7) ))
        {
                if(!letztetastenposition2)
                {    
                    zaehlwert--; 
                }
            letztetastenposition2=1;
        }
        else
        {    
                letztetastenposition2=0;
        }    //Taster 2 ENDE
        
        //Taster entprell Funktion

        void entprellung (uint8_t *port, uint8_t maske)
        {
            uint8_t        port_puffer;
            uint8_t     entprellungs_puffer;
            
            for(entprellungs_puffer=0; entprellungs_puffer !=0xFF;)
            {
                entprellungs_puffer<<=1;
                port_puffer = *port;
                _delay_us(150);
                    
                    if( (*port == maske) == (port_puffer == maske) )
                    
                        entprellungs_puffer != 0x01;
                    
            }
        }
        
        //Kanal-Begrezung

        if(zaehlwert >511)
        {
          zaehlwert=0;
        }    
        
        if(zaehlwert < 0)
        {
            zaehlwert = 511;
        }            
          
        // 7-Segment-Anzeigen splitten

        stelle1 = zaehlwert/100;
        stellezwischenschritt = zaehlwert/10;
        stelle2 = stellezwischenschritt - (stelle1*10);
        stelle3 = zaehlwert - (stellezwischenschritt*10);

        
        //Schleifendurchläufzähler begrenzen
        
        if(ziffer>3)
        {
          ziffer=1;
        }  
        
        //Transistoren schalten

       if(ziffer == 3)
        {
            PORTA = 0b11111110;        //Ausgang low    
            PORTC =~ seg[stelle3];
        }

        if(ziffer == 2)
        {
            PORTA = 0b11111101;        //Ausgang low
            PORTC =~ seg[stelle2];
        }

        if(ziffer == 1)
        {
            PORTA = 0b11111011;        //Ausgang low
            PORTC =~ seg[stelle1];
        }
    }

    return 0;            
}   //END MAIN
Ich bekomme zwei Fehler:
../DMXAdressengeber.c:86: error: static declaration of 'entprellung' follows non-static declaration
../DMXAdressengeber.c:51: error: previous implicit declaration of 'entprellung' was here
../DMXAdressengeber.c: In function 'entprellung':
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)