Go Down

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

agmue

Man braucht keinen externen Widerstand, wenn man den internen PullUp aktiviert. Ihn setzt man, in dem man einen Eingang mit digitalWrite(Pin, HIGH) aktiviert.
Oder INPUT_PULLUP, was aber nicht immer funktioniert, beim UNO aber schon.

Code: [Select]
void loop()
{
  if(digitalRead(anaus)) {display_zeichen=1}else{display_zeichen=0}
  zeil_schreib();
...

So sollte es mit PullUp gehen, hoffe ich.
Deiner Antwort entnehmen ich das du nicht an einer Matrix getestet hast.
Richtig, ich hätte eine in der Schublade, aber 74HC595 als Schieberegister. Eigentlich wollte ich mich an der Verkürzung des Programms für den ATtiny versuchen  ;)

Theseus

Die Abfrage des Tasters ist im Code nicht enthalten da ich das Sketch so wie es bisher funktioniert gepostet habe.
Wie gepostet, funktioniert das Programm? So bald du die Abfrage einbaust, funktioniert es nicht mehr? Die Leds zeigen zufällige Inhalte?

Gundelputz

Wie gepostet, funktioniert das Programm? So bald du die Abfrage einbaust, funktioniert es nicht mehr? Die Leds zeigen zufällige Inhalte?

Ja. Ja. Ja.

Theseus

#48
Feb 23, 2016, 11:15 am Last Edit: Feb 23, 2016, 11:16 am by Theseus
Ich habe den Code etwas überarbeitet. Das Zeichen wird gelöscht, in dem die Zeile mit Null multipliziert wird.

Auf das Array zeilen_wert[8] könnte man mit BitShift-Befehlen verzichten. Habe es unten als Alternative aufgeführt.

Syntax-Fehler können noch im Code enthalten sein.

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

byte zeichen=1;


void setup()
{
  pinMode(freigabe1, OUTPUT);
  pinMode(tackt1, OUTPUT);
  pinMode(bit1, OUTPUT);
  pinMode(anaus, INPUT);
  digitalwrite(anaus, HIGH); //PullUp
  zeil_schreib();
}

void zeil_schreib()
{    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;
 
}

void loop()
{
 
    zeichen=digitalread(anaus);

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

      daten_reihe = zeilen_wert[i]*zeichen;     //0, wenn Taste gedrückt
      shiftOut(bit1, tackt1, LSBFIRST, daten_reihe);//aktuelle Zeile in Schieberegister

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

      digitalWrite(freigabe1, HIGH);
    }

 }

agmue

Ich bitte auch um freundliche Beachtung von #45  :D

Theseus

#50
Feb 23, 2016, 12:26 pm Last Edit: Feb 23, 2016, 12:28 pm by Theseus
Ich glaube, ich habe den Bösewicht im defekten Code gefunden:

    case 1: //defaulte (display aus
      spalten_wert[8] = 0b00000000;

Bei Arrays nennt man zwar bei der Deklaration die Zahl n der Elemente, aber der Index fängt bei 0 an und geht bis n-1. Dein Index geht also nur von 0 bis 7, die 8 überschreibt was im Speicher. Durch Anpassung der Indexes kannst du noch ein paar Bytes sparen. Du benutzt Element 0 nicht.

agmue

Ich glaube, ich habe den Bösewicht im defekten Code gefunden:
Böse Falle, gut gesehen!

uxomm

Always decouple electronic circuitry.

Gundelputz

Also die Gute Nachricht mal vorweg.
Mit dem gelieferten Code funktioniert es genau so wie es soll.
meinen dank vom ganzen Herzen.
Ich muss euch aber enteuschen. an der achten Reihe lag es nicht. die hatte ich nur zum Test eingebaut bzw. geändert und lediglich diese noch nicht entfernt.
Um den Code aber zu verstehen hätte ich da noch ein paar Fragen:
Warum zeil_schreib(); ins setup?
Was genau macht zeilen_wert*zeichen?
Du schreibst:"Ich bitte auch um freundliche Beachtung von #45". Welche Zeile meinst du da? Bei mir steht da  shiftOut(bit1, tackt1, LSBFIRST, daten_reihe);//aktuelle Zeile in Schieberegister.

Gundelputz

sorry du meintest nicht das Sketch sondern den Beitragseintrag.

an dieser Stelle möchte ich mich auch mal bei den Mitglieder hier im Forum bedanken. Ich kenne auch ander Foren in dennen ein Hilfesuchender nicht so offen und herzlich unterstützt wird. Es ist wirklich sehr angenehm hier auf Menschen zu treffen die den Sinn eines Forums noch verstehen.
Vielen Dank also noch mal und bleibt so.

Theseus

Zu 53: Das Array behält die gesamte Zeit seinen Inhalt. Deshalb habe ich zeil_schreib();ins Setup geschrieben. Man könnte das Array gleich in der Variablendeklaration füllen.

zeilen_wert*zeichen: Zeichen ist je nach Schalterstellung mal 1 mal 0. Etwas mal 1 bleibt unverändert und etwas mal 0 gibt immer 0-> Zeile gelöscht.


Funktioniert es denn jetzt?

Gundelputz

Ja es funktioniert einwandfrei.
Noch mal vielen Dank auch für die Erklärungen.

Go Up