Go Down

Topic: Attiny13 bothloader brennen (Read 2228 times) previous topic - next topic

Serenifly

#30
Feb 22, 2016, 05:32 pm Last Edit: Feb 22, 2016, 05:34 pm by Serenifly
Code: [Select]

byte zeilen_wert[8] = {1, 2, 4, 8, 16, 32, 64, 128};

Dafür braucht man kein Array. Sondern man fängt bei 1 an und verdoppelt den Wert nach dem er verwendet wurde


Ansonsten den Code mal auf einem UNO testen. Nicht dass nicht doch irgendwo einen Logik-Fehler drin ist

Gundelputz

gleiche Problem am UNO
sobald ich die IF entferne ist alles wieder i.O.
igend ne Idee was an der Abfrage falsch ist?
Code: [Select]

void loop()
{
  zeil_schreib();

  if (digitalRead(anaus) == LOW)
  {
    display_zeichen = 1;
  }
  else
  {
    for (byte i = 1; i < 8; i++)
    {
      digitalWrite(freigabe1, LOW);

      daten_reihe = zeilen_wert[i];     //übergabe des aktuellen Zeilenwertes
      shiftOut(bit1, tackt1, LSBFIRST, daten_reihe);//aktuelle Zeile in Schieberegister

      daten_spalte = spalten_wert[i];   //übergabe des aktuellen Spaltenwertes
      shiftOut(bit1, tackt1, LSBFIRST, daten_spalte);////aktuelle Spalte in Schieberegister

      digitalWrite(freigabe1, HIGH);
    }
  }
}

agmue

#32
Feb 22, 2016, 08:02 pm Last Edit: Feb 22, 2016, 09:21 pm by agmue Reason: Pin-Nummern korrigiert
Etwas abgespeckt:
Code: [Select]
//
//                  +-\/-+
// Ain0 (D 5) PB5  1|    |8  Vcc
// Ain3 (D 3) PB3  2|    |7  PB2 (D 2) (SCL)
// Ain2 (D 4) PB4  3|    |6  PB1 (D 1)
//            GND  4|    |5  PB0 (D 0) (SDA)
//                  +----+
const byte freigabe1 = 4;   //Tiny13  PIN3 (storePin)
const byte takt1 = 1;      //Tiny13 PIN6 (clockPin)
const byte bit1 = 2;        //Tiny13 PIN7(datapin)
byte daten_spalte;//Wert für Spalten
byte daten_reihe;//Wert für Zeilen
const byte zeilen_wert[8] = {1, 2, 4, 8, 16, 32, 64, 128}; //zum speichern des aktuellen zeilenwertes
byte spalten_wert[8];                          //zum speichern des aktuellen zeilenwertes
byte display_zeichen = 0;//Auswahl des wiederzugebenen Zeichen
const byte anaus = 0; //Tiny13 PIN5

void setup()
{
  pinMode(freigabe1, OUTPUT);
  pinMode(takt1, OUTPUT);
  pinMode(bit1, OUTPUT);
  pinMode(anaus, INPUT);
}

void loop()
{
  if (digitalRead(anaus))
  {
    spalten_wert[7] = 0b01110111; //136;// von links nach rechts 1=aus 0=an
    spalten_wert[6] = 0b01110111; //112;
    spalten_wert[5] = 0b01110111; //112;
    spalten_wert[4] = 0b00000111; //112;
    spalten_wert[3] = 0b01110111; //112;
    spalten_wert[2] = 0b01110111; //112;
    spalten_wert[1] = 0b10001111; //136;
  } else {
    for (byte i = 1; i <= 8; i++) {
      spalten_wert[i] = 0b00000000;
    }
  }
  for (byte i = 1; i < 8; i++)
  {
    digitalWrite(freigabe1, LOW);
    shiftOut(bit1, takt1, LSBFIRST, zeilen_wert[i]);//aktuelle Zeile in Schieberegister
    shiftOut(bit1, takt1, LSBFIRST, spalten_wert[i]);////aktuelle Spalte in Schieberegister
    digitalWrite(freigabe1, HIGH);
  }
}

Gundelputz

Vielen Dank für die Mühe aber irgendwie steige ich durch deinen Code nicht durch. Habe ihne mal aufgespielt obwohl ich ihn erst mal gerne verstehen würde. Egal ob ich nun den Taster drücke oder nicht es Flimmern immer alle LED.
für dich zur Info: Beim Tiny13 werden nicht die PIN am IC im Sketch angegeben sondern die Datenausgänge. So ist P0 der PIN5 am Tiny(aber vieleicht wolltest du mich auch Testen ;)  ).
Am Uno funktioniert er gleich garnicht.
Aber mal im ernst die deklaration der Variablen und Constanten ist mir noch klar aber die letzte Zeile im void setup ist mir neu. Was verbirgt sich hinter INPUT_PULLUP?
Wenn ich das richtig lese scheint dies ein art abfrage des Port zu sein an dem der Taster angeschlossen ist. Wenn dem so ist dann sollte man es vereinfacht so lesen können:

wenn anaus = nicht LOW //oder nicht gedrückt
dann
stelle Zeichensatz zur verfügung
ansonsten //Taster gedrückt
schreibe das Zeichen
ende

dies ergibt für mich wenig Sinn. Wenn es nicht all zuviel arbeit für dich ist könntest du mir das dann ein wenig erklähren.
Ich hab noch viel zu lernen.

agmue

#34
Feb 22, 2016, 09:20 pm Last Edit: Feb 22, 2016, 09:22 pm by agmue
für dich zur Info: Beim Tiny13 werden nicht die PIN am IC im Sketch angegeben sondern die Datenausgänge. So ist P0 der PIN5 am Tiny(aber vieleicht wolltest du mich auch Testen ;)  ).
Ich teste mit einem Mega2560 und habe beim Zurückändern dann nicht bemerkt, daß Du die Pinnummern des IC im Kommentar stehen hast. Sorry, habe ich korrigiert.

Ebenso ein Überbleibsel des Testens ist INPUT_PULLUP, womit der interne PullUp-Widerstand aktiviert wird. Ein Draht gegen GND ersetzt den Taster. Ob das bein ATtiny13 auch funktioniert, weiß ich nicht. Nochmal sorry, ich bin halt faul!

Wenn Taster HIGH, dann Buchstabe "A" nach spalten_wert speichern und anzeigen;
sonst Nullen nach spalten_wert speichern und anzeigen.

Bei mir zappeln die Ausgänge ständig, ist das nicht das Ziel? Da hängt doch ein Schieberegister dran, oder?

Gundelputz

Wollte die keinen Vorwurf machen. Deiner Antwort entnehmen ich das du nicht an einer Matrix getestet hast. "Zappeln" tun die LED auch bei mir. Leider stellt sich das dann als komplette Fläche dar. Obwohl mir eine Softwarelösung lieber während ist mein Plan B eine Hardware Lösung mittel Transi oder ULN. Andererseits fliegen wir auch zum Mond da werde ich mich (wir) so leicht nicht geschlagen geben. Also hat noch jemand nen Vorschlag wie man die Tastenabfrage geschickt einbauen kann? Wenn es hilfreich ist kann ich auch ein Bild vom Aufbau einstellen.

agmue

Wollte die keinen Vorwurf machen. Deiner Antwort entnehmen ich das du nicht an einer Matrix getestet hast.
Nee, alles gut  :)  Genaugenommen kann ich diesem Thema nicht entnehmen, welche Hardware Du betreibst. In einem Kommentar steht "CD4094", das ist ein Schieberegister, der einzige Hinweis, den ich finden konnte. Was hängt tatsächlich am Arduino?

Gundelputz

Folgende Komponenten benutze ich für dieses Projekt:
Arduino UNO bzw. Tiny13
2 Schieberegister 74HC4094
5x7 Dot Matrix
Taster zum testen

Da mir für mein aktuelles Projekt die Pins ausgehen versuche ich zu sparen wo es nur geht. So habe ich folgendes geplant:
4 Siebensegmentanzeige
1 8x8 Dotmtrixanzeige rot/grün (zusammen orange)
4 5x7 Dotmtrixanzeige
1 IR Versteuerung(Empfänger und Fernbedienung)
1 80db Pietzosummer
Bisher habe ich schon alles bis auf die 4 DMD fertig
Eigentlich hatte ich angenommen dies während der einfachste Teil. Sollen hier doch jeweils zwei Display mit einem festen Zeichen angezeigt werden. Die Idee dahinter ist einen Tiny pro Segment zu verwenden und diesen als Schalter zu missbrauchen. Es sollen die Zeichen AB oder CD angezeigt werden. Bei High das eine bei Low das andere. Somit wird nur ein Ausgang benötigt.

agmue

#38
Feb 22, 2016, 10:41 pm Last Edit: Feb 22, 2016, 10:42 pm by agmue
Also geht es um 5x7 Dot Matrix an zwei 2 Schieberegister 74HC4094, richtig? Wie hast Du die verdrahtet? Vermutlich Spalten und Reihen? Dann mußt Du doch multiplexen, richtig? Das bedeutet für mich ständiges Gezappel an den Ausgängen, oder?

Gundelputz

Richtig.
An erste SR Zeilen und ans zweite die Reihen. Beide sind seriell mit einander verbunden. Also erst Reihen rein dann Zeilen und dann noch freigeben. Funktioniert auch Super bis ich die Abfrage für den Taster einbaue.

agmue

Wo finde ich den funktionierenden Sketch?

Gundelputz

hier der Code und eine Zeichnung vom Aufbau

Code: [Select]
const byte freigabe1 = 3;   //Tiny13  PIN3 (storePin)
const byte tackt1 = 2;      //Tiny13 PIN6 (clockPin)
const byte bit1 = 1;        //Tiny13 PIN7(datapin)
byte daten_spalte;//Wert für Spalten
byte daten_reihe;//Wert für Zeilen
byte zeilen_wert[8] = {1, 2, 4, 8, 16, 32, 64, 128}; //zum speichern des aktuellen zeilenwertes
byte spalten_wert[8];                          //zum speichern des aktuellen zeilenwertes
byte display_zeichen = 0;//Auswahl des wiederzugebenen Zeichen
byte anaus =  0;//Tiny13 PIN5 für Taster

void setup()
{
  pinMode(freigabe1, OUTPUT);
  pinMode(tackt1, OUTPUT);
  pinMode(bit1, OUTPUT);
  pinMode(anaus, INPUT);
}

void zeil_schreib()
{
  switch (display_zeichen)
  {
    case 0: //A
      spalten_wert[7] = 0b01110111; //136;// von links nach rechts 1=aus 0=an
      spalten_wert[6] = 0b01110111; //112;
      spalten_wert[5] = 0b01110111; //112;
      spalten_wert[4] = 0b00000111; //112;
      spalten_wert[3] = 0b01110111; //112;
      spalten_wert[2] = 0b01110111; //112;
      spalten_wert[1] = 0b10001111; //136;
      break;
    case 1: //defaulte (display aus
      spalten_wert[8] = 0b00000000;
      spalten_wert[7] = 0b00000000; //136;// von links nach rechts 1=aus 0=an
      spalten_wert[6] = 0b00000000; //112;
      spalten_wert[5] = 0b00000000; //112;
      spalten_wert[4] = 0b00000000; //112;
      spalten_wert[3] = 0b00000000; //112;
      spalten_wert[2] = 0b00000000; //112;
      spalten_wert[1] = 0b00000000; //136;
      break;
  }
}

void loop()
{
 
  zeil_schreib();

        for (byte i = 1; i < 8; i++)
    {
      digitalWrite(freigabe1, LOW);

      daten_reihe = zeilen_wert[i];     //übergabe des aktuellen Zeilenwertes
      shiftOut(bit1, tackt1, LSBFIRST, daten_reihe);//aktuelle Zeile in Schieberegister

      daten_spalte = spalten_wert[i];   //übergabe des aktuellen Spaltenwertes
      shiftOut(bit1, tackt1, LSBFIRST, daten_spalte);////aktuelle Spalte in Schieberegister

      digitalWrite(freigabe1, HIGH);
    }

 }

Theseus

Hallo,

wenn ich das richtig sehe, dann fehlt deinem Schalter der Pull-Up. In deinem Sketch finde ich keine Aktivierung eines Internen. Alternativ kann man einen Widerstand zwischen Eingangspin und Versorgungsspannung von 5k-50k nehmen. So erkennt der Attiny zufällig mal Schalter an mal aus.

Gundelputz

Der Widerstand wird bei lowprüfen nicht benötigt da hier der interne Widerstand genutzt wird(so wurde es mir erklärt und macht lt. Datenblatt des Arduino's auch Sinn). Beim Tiny bin ich mir noch nicht sicher habe das abert schon getestet und keine besserung erfahren. Der Fehler liegt im Programm.
Die Abfrage des Tasters ist im Code nicht enthalten da ich das Sketch so wie es bisher funktioniert gepostet habe.

Theseus

Der Widerstand wird bei lowprüfen nicht benötigt da hier der interne Widerstand genutzt wird(so wurde es mir erklärt und macht lt. Datenblatt des Arduino's auch Sinn). Beim Tiny bin ich mir noch nicht sicher habe das abert schon getestet und keine besserung erfahren.
Ein offener Eingang schaltet zufällig hin und her. Man braucht keinen externen Widerstand, wenn man den internen PullUp aktiviert. Ihn setzt man, in dem man einen Eingang mit digitalWrite(Pin, HIGH) aktiviert. Das fehlt in deinem Programm und im Schaltplan gibt es auch keinen externen PullUp.

Go Up