Durch Tastendrucke + 7 Segment Ports Schalten

Hi Dino,

Eigentlich kann es nur am Board liegen. Ich habe alles nachgeschaut. Nichts!
 
Ich peil das nicht. Ich habe den ATMEGA nochmal auf die andere Seite gesteckt. Irgendwas funktioniert noch nicht. Wieviel Spannung muss an den ISP Pins und - anliegen? Ich habe auch schon die Kabel getauscht, also auch kein Kabelbruch. (Was bei diesen dünnen starren Drähten ja mal passieren kann) Wenn ich nur + und - am Programmer anschließe, blinkt die LED nähmlich auch. Also muss es wahrscheinlich mit der Kontakten zusammenhängen.
 
Programmer-Anschluß

Hi Kani,

Wieviel Spannung muss an den ISP Pins und - anliegen? Ich habe auch schon die Kabel getauscht, also auch kein Kabelbruch.
also der 6-polige Stecker vom Programmer hat an einer Breit-Seite einen kleinen
Pfeil eingeprägt. An der Stelle ist der Pin 1 vom Stecker. Dann zählt man
folgendermaßen weiter ...
- gegenüber vom Pin1 ist Pin2
- dann wieder auf der anderen Seite neben Pin 1 ist Pin 3
- usw..

Es wird also im Zick-Zack gezählt.
Man hat auf der Seite mit dem Pfeil (das war Pin 1) alle ungeraden Pins
und auf der gegenüberliegenden Seite hat man alle gerade Pins.


CodeBox PINBELEGUNG
ISP-Anschluß
__
| |
MISO 1 <|OO| 2 VTG
SCK 3 |OO| 4 MOSI
RST 5 |OO| 6 GND
|__|


Der Haken neben der 1 soll den Pfeil auf dem Stteckergehäuse andeuten.
Über den Anschluß VTG mißt der Programmer die Spannung des Zielsystems.
Also ob deine Schaltung mit 5V oder z.B. mit 3,3V betrieben wird. Das
kannst Du sogar in der Programmiermaske des AVR-Studios abfragen.
Deine Schaltung wird also NICHT über den Programmer versorgt.

Welchen ATmega verwendest Du jetzt eigentlich genau ??
ATmega32, ATmega8535 oder ATmega8515 ? Weil vorne im Thread was von
8515 steht.

Der Atmega 8535 ist Pin-Kompatibel mit dem ATmega32.
Der ATmega8515 ist ANDERS BESCHALTET !

ATmega16/32 + 8535 + 644
MOSI --- 6
MISO --- 7
SCK --- 8
Reset --- 9
GND --- 11+ 31
+5V --- 10 + 30 (VTG)

ATmega8515
MOSI --- 6
MISO --- 7
SCK --- 8
Reset --- 9
GND --- 20
+5V --- 40 (VTG)

Also aufpassen.
Dadurch verschieben sich auch einige andere Port-Pins !

Gruß
Dino
 
Hi Finn,

Ups, Fehler gefunden!
sieht so aus ;-)

Für alle anderen hier das Ergebnis eines längeren Chats
GND.jpg
So wie es aussieht ist der Pin20 (GND) nur über einen
Kondensator angeschlossen. Dadurch bekommt der
Mega zwar noch seine +5V an Pin 40 aber trotzdem
keinen Strom ;-) und der Reset-Pin liegt dadurch
über den Prozessor auf Dauer-High (+5V). Die restliche
Beschaltung scheint soweit zu stimmen. Wird man aber
erst nach dem Tausch des Kondensators gegen einen
Draht sehen.

Manchmal sieht man vor lauter Fehlersuche den Wald vor
Bäumen nicht mehr und dann ist es immer gut, mal nen
anderen drübersehen zu lassen :)

Gruß
Dino
 
Jap, so alle Probleme gelöst. Weiter gehts:

Für Nomis einmal der Code...[Chat ging nicht alles]

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 <stdio.h>

#include <util/delay.h>

#define F_CPU 16000000UL

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;
    unsigned char 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(10);        //While-Schleife verlangsamen damit die Transistoren nicht zu oft schalten
        
        ziffer++;

        //Taster 1 (Up)

        if( ! (PINA & (1<<PA3) ))        //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)
        
        
        if( ! (PINA & (1<<PA4) ))
        {
            if(!letztetastenposition2)
            {
                zaehlwert--;            
            }
        letztetastenposition2=1;
        }
        else
        {    
                letztetastenposition2=0;
        }    //Taster 2 ENDE
        
        
        //Kanal-Begrezung

        if(zaehlwert >511)
        {
          zaehlwert=0;
        }    
        
        if(zaehlwert < 0)
        {
            zaehlwert = 512;
        }            
          
        // 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 = 0b1111110;        //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
 
Der Fehler ist - naja, sagen wir mal - dämlich. Wie Dino schon meinte, sieht man oft den Wald for lauter Bäumen nicht mehr. Schaut euch mal das letzte Bild an. Blickpunkt: Widerstände.
 
Hi Finn,

Der Fehler ist - naja, sagen wir mal - dämlich. Wie Dino schon meinte, sieht man oft den Wald for lauter Bäumen nicht mehr. Schaut euch mal das letzte Bild an. Blickpunkt: Widerstände.
noch nen Bock drin :D
Leben die Anzeigen und der 8515 noch ? Muß ja nen ganz schöner Strom
geflossen sein ;)
Das war wohl nicht so ganz dein Tag. Naja Schwamm drüber :D Weiter
gehts ...

Gruß
Dino
 
Lebt noch alles....mir aufgefallen, dass der Strom ja nicht durch den Widerstand sondern direkt durch die Leiterbahn geflossen ist. xD

@Nomis:
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 <stdio.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;
    unsigned char 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(10);        //While-Schleife verlangsamen damit die Transistoren nicht zu oft schalten
        
        ziffer++;

        //Taster 1 (Up)

        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)
        
        
        if( ! (PINA & (1<<PA7) ))
        {
            if(!letztetastenposition2)
            {
                zaehlwert--;            
            }
        letztetastenposition2=1;
        }
        else
        {    
                letztetastenposition2=0;
        }    //Taster 2 ENDE
        
        
        //Kanal-Begrezung

        if(zaehlwert >511)
        {
          zaehlwert=0;
        }    
        
        if(zaehlwert < 0)
        {
            zaehlwert = 512;
        }            
          
        // 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 = 0b1111110;        //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
 
Also die Sache läuft jetzt. Dank meiner Hellseherischen Fähigkeiten(man will nicht unbescheiden sein) konnten nun weitere Fehler gefunden werden(die von weiter oben wurden von Dino und Kani entdeckt):
1) Ein NPN Transistor hat sich unter die PNPs geschlichen.
2)Transistoren hatten Collektor und Emitter vertauscht.
3)Kani hat immer ein Hex-File geladen dass nicht zu seinem aktuellen Projekt gehörte.

usw.
 
Die entprellung müsste ja so sein:

Wenn Taster1 gedrückt wird (tastenposition1=1), soll ein Schleifendurchlaufzähler 50 Schleifendurchläufe lang tastenposition1=0 ausgeben, damit er nicht auf 1 (Wippen der Kotakte) gestellt werden kann. Wenn die Schleifendurchläufe durchgelaufen sind, wird der Taster wieder freigegeben. Wie lösche ich, dass von der Entprellung hervorgerufene tastenposition1=0 ?

@Nomis: Jap ich bin doof, ich weiß :p
Jeder hat seine Spezialgebiete.
 
@Nomis: Jap ich bin doof, ich weiß :p
Jeder hat seine Spezialgebiete.

Ich wollte dir zwar was vermitteln, daber das war es nicht.:(
Das ist doch nur eine faule Ausrede dafür, nicht genug Zeit in eine Angelegenheit investieren zu wollen.

Meiner Meinung nach haben wir dir schon zu sehr geholfen, daher würd ich sagen du meisterst den nichtblockierenden Entprellungsalgorithmus selbst. Es steht dir natürlich Frei deinen Denkprozess mittels Programmablaufplänen oder ähnlichem für uns zu dokumentieren.
 
Hi Finn,

Ich mache meine Entprellung folgendermaßen :

Der Status vom Eingangspin (0/1) wird bei jedem Schleifendurchlauf
in ein register geschoben.

76543210<---Pin

Also ein 8-Bit Schieberegister.
Wenn der Taster an dem Pin prellt hast Du im Register ein wildes
Durcheinander von Einsen und Nullen. Wenn er nicht mehr prellt dann
hast du entweder 8x Eins oder 8x Null. Wenn Du also auf 0x00 oder auf
0xFF testest weißt Du das der Taster jetzt gedrückt oder losgelassen
ist. Das ist aber noch keine Erkennung ob er gedrück wurde sondern
lediglich eine Entprellung. Beim Test aus drücken oder loslassen mußt
Du den Wechsel von 0x00 auf 0xFF oder 0xFF auf 0x00 testen.

Ist im Moment wohl etwas gewuselt erklärt :D

Aber für nen Gedankenschubs sollte es reichen ;-)

Gruß
Dino
 
Aber für nen Gedankenschubs sollte es reichen ;-)
Der ist aber schonmal geschubst worden, und zwar von mir und in die andere Richtung. :D

Ich muss aber sagen dass der Algorithmus den Kani bisher angestrebt hat besser auf unterschiedliche Prellverhalten adaptierbar ist.
Was wenn die Zeit zwischen den den Prellflanken so groß ist dass damit ein ganzes byte mit 1ern gefüllt werden kann? Ich würd aber grob schätzen dass dein Algorithmus in diesem Fall(bei kanis Abtastrate) praktischer ist.
 
Hallo Nomis,

Ich muss aber sagen dass der Algorithmus den Kani bisher angestrebt hat besser auf unterschiedliche Prellverhalten adaptierbar ist.
Was wenn die Zeit zwischen den den Prellflanken so groß ist dass damit ein ganzes byte mit 1ern gefüllt werden kann? Ich würd aber grob schätzen dass dein Algorithmus in diesem Fall(bei kanis Abtastrate) praktischer ist.
der Algorithmus klappt gut. Pro Hauptschleifendurchlauf wird 1 Bit in das
Register geschhoben. Also brauche ich 8 Durchläufe durch die Hauptschleife
bei dem jedesmal der Pin abgefragt und als 1 Bit eingeschoben wird. Wenn es
bei langsameren Schleifen zu langsam für manche Sachen ist, dann maskiere
ich einfach auf 4 oder 3 Bit und habe bereits nach 4 oder 3 Durchläufen die
entprellte Taste ;-) Den Algorithhmus nehme ich mit 4Bit-Schieberegister
sogar für meinen Dreh-Encoder. Das Ding läuft sogar bei vollen 16MHz auf
voll Speed in der Hauptschleife absolut zuverlässig.

Gruß
Dino
 
Also ist Dino's Lösung der "Allrounder"?
Dann probier ich das mal. Ich melde mich, wenn ich soweit bin.
 
Hi Finn,

Also ist Dino's Lösung der "Allrounder"?
Dann probier ich das mal. Ich melde mich, wenn ich soweit bin.
das ist kein Allrounder. Bei meinem Analyzer hab ich über PinChangeInterrupt
und ner Interrupt-Service-Routine die Tasten entprellt in dem ich sie einzeln
aktiviert habe und dann nachgesehen hab ob sie gedrückt sind oder nicht.

Jede Aufgabe hat teilweise mehrere Lösungen. Man muß sehen, was man
am liebsten einsetzen möchte oder was am praktischsten oder einfachsten
umzusetzen ist.

Bascom arbeitet mit Wartezeiten. (delay)

Viele Wege führen nach Rom ;)

Gruß
Dino
 
Mit delays kann ich entprellen, dass bekomme ich hin. Nur ich möchte eine schönere Variante finden, damit der Controller keine Rechenzeit verschwendet.
 

Ü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)