INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Interupt timer 4x7 Segement Display und Serial read
18.09.2014, 12:18
Beitrag #1
Interupt timer 4x7 Segement Display und Serial read
Moinsen,

ich habe eigentlich schon das Problem erkannt, aber keinen Schimmer wie ich es rauscodiere. Ich nutze ein 4x7 Segment Display und Multiplexe. Nun möchte ich "nebenher" RFID Tags auslesen und daher die Serialschnittstelle nutzen. Ich bekomme jedoch nur Datenmüll, da, so wie ich es verstanden habe (Netzrecherche) hier durch das Multiplexing der Interupttimer mit dem Serial auslesen im Konflikt steht. Kann ich den Timer kurz aussetzen, das Tag ausslesen und dann wieder starten??? Wenn ja wie?Huh Achso ich bin ein Samplecodekopierer... Big GrinUndecided

Code:
#line 1 "sketch_sep09a.ino"
#include "Arduino.h"
#include <SoftwareSerial.h>

SoftwareSerial RFID(0, 1); // RX and TX

const int clock = 7; //SCK
const int latch = 5; //RCK
const int data = 6;  //DIO

byte value[] ={
                B11000000, // 0
                B11111001, // 1
                B10100100, // 2
                B10110000, // 3
                B10011001, // 4
                B10010010, // 5
                B10000010, // 6
                B11111000, // 7
                B10000000, // 8
                B10010000, // 9
                B11111111};// display nothing

byte digit[] ={ B00000001, // left segment
                B00000010,
                B00000100,
                B00001000,
                B00010000,
                B00100000,
                B01000000,
                B10000000}; // right segment
                
byte valued[] ={ B01000000, // 0.
                 B01111001, // 1.
                 B00100100, // 2.
                 B00110000, // 3.
                 B00011001, // 4.
                 B00010010, // 5.
                 B00000010, // 6.
                 B01111000, // 7.
                 B00000000, // 8.
                 B00010000, // 9.
                 B11111111};// display nothing

byte ii = 0;

byte v0, v1,v2,v3,v4,v5,v6,v7;
byte vvalue = value[0];

void setup() {
  
  RFID.begin(4800);    // start serial to RFID reader
  Serial.begin(9600);  // start serial to PC
  
  pinMode(clock, OUTPUT);
  pinMode(latch, OUTPUT);
  pinMode(data, OUTPUT);

  cli();//stop interrupts
  //set timer0 interrupt at 980Hz
  TCCR0A = 0;// set entire TCCR0A register to 0
  TCCR0B = 0;// same for TCCR0B
  TCNT0  = 0;//initialize counter value to 0
  OCR0A = 255;//(must be  16000000 / (prescaler*255) = 980 Hz
  TCCR0A |= (1 << WGM01);
  TCCR0B |= (1 << CS01) | (1 << CS00);   //prescaler = 64
  TIMSK0 |= (1 << OCIE0A);
  sei();//allow interrupts

  v0=v1=v2=v3=v4=v5=v6=v7=10; // default: show nothing
  
}

ISR(TIMER0_COMPA_vect){  
  ii++;
  if (ii==8) ii=0; // wenn alle Stellen (digits) Z\u00e4hler zur\u00fccksetzen

  if (ii==0) { vvalue = v0; }
  else if (ii==1) { vvalue = v1; }    
  else if (ii==2) { vvalue = v2; }
  else if (ii==3) { vvalue = v3; }
  else if (ii==4) { vvalue = v4; }
  else if (ii==5) { vvalue = v5; }
  else if (ii==6) { vvalue = v6; }
  else if (ii==7) { vvalue = v7; }

  digitalWrite(latch,LOW);
  shiftOut(data,clock,MSBFIRST,B11111111);
  shiftOut(data,clock,MSBFIRST,B11111111);
  digitalWrite(latch,HIGH);

  digitalWrite(latch,LOW);
  shiftOut(data,clock,MSBFIRST,digit[ii]);
  if ( (ii==0) || (ii==2) ||(ii==4) || (ii==6) )
    shiftOut(data,clock,MSBFIRST,valued[vvalue]);
  else
    shiftOut(data,clock,MSBFIRST,value[vvalue]);
  digitalWrite(latch,HIGH);  
}


int tag1[12] = {32,48,52,49,56,53,58,51,61,55,57,32};
int tag2[12] = {32,48,52,49,56,53,58,51,52,50,53,32};
int newtag[12] = {0,0,0,0,0,0,0,0,0,0,0,0}; // used for read comparisons
int rfiddata = 0;

int zeit = 0;
int zeita = 0;
int zeitb = 0;
int t = 100; //ms 100ms = 1 zehntel Sekunde


// 1 ms = 0,001s; 100ms = 0,1s

void loop() {// loop Dauerschleife!!!

  delay(t);  //ms
  
  if (RFID.available() > 0) {
    
    delay(t);  //ms Zeit zum Datenempfang
    
    for (int z = 0 ; z < 12 ; z++) // read the rest of the tag
    {
      rfiddata = RFID.read();
      newtag[z] = rfiddata;
      
    }
    
    RFID.flush(); // stops multiple reads
    Serial.print(newtag[0], DEC);
    Serial.print(newtag[1], DEC);
    Serial.print(newtag[2], DEC);
    Serial.print(newtag[3], DEC);
    Serial.print(newtag[4], DEC);
    Serial.print(newtag[5], DEC);
    Serial.print(newtag[6], DEC);
    Serial.print(newtag[7], DEC);
    Serial.print(newtag[8], DEC);
    Serial.print(newtag[9], DEC);
    Serial.print(newtag[10], DEC);
    Serial.print(newtag[11], DEC);
    Serial.println("");
  }
  

  
    if ((comparetag(newtag, tag1) == true) && (zeita<6000)) {
      zeita++; //10zeit = 10*100ms = 1s .... 10 sek = ((10*t)*10)
      
      int zs = zeita % 10; //zehntelsekunde zeita<=9
      int s1 = zeita / 10 % 10; //Sekunde einerstelle zeita<=99
      int s2 = zeita / 100; s2 = s2 % 6; //sekunde zehnerstelle zeita<=999
      int m1 = zeita * 1.6667*0.001; //minute einstelle
          
      v0 = m1; // Minuten
      v1 = s2; // zehnersekunde
      v2 = s1; // sekunde
      v3 = zs; // milisekunden
    }
  
    if ((comparetag(newtag, tag2) == true) && (zeitb<6000)) {
      zeitb++; //10zeit = 10*100ms = 1s .... 10 sek = ((10*t)*10)
      
      int zs = zeitb % 10; //zehntelsekunde zeitb<=9
      int s1 = zeitb / 10 % 10; //Sekunde einerstelle zeitb<=99
      int s2 = zeitb / 100; s2 = s2 % 6; //sekunde zehnerstelle zeitb<=599
      int m1 = zeitb * 1.6667*0.001; //minute einstelle
          
      v4 = m1; // Minuten
      v5 = s2; // zehnersekunde
      v6 = s1; // sekunde
      v7 = zs; // milisekunden
    }

zeit++;  
}

boolean comparetag(int aa[12], int bb[12])
{
  boolean ff = false;
  int fg = 0;
  for (int cc = 0 ; cc < 12 ; cc++)
  {
    if (aa[cc] == bb[cc])
    {
      fg++;
    }
  }
  if (fg == 12)
  {
    ff = true;
  }
  return ff;
}

  
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  neues OLED Display nötig an vorhandenem uC Systemswerlich Ersatz hd311 7 124 Heute 11:16
Letzter Beitrag: hd311
  Pinbelegung TFT-Display ILI9341 mingo 19 400 23.03.2017 17:49
Letzter Beitrag: oOSpikeOo
  RGB Animation über Serial Steuern Medolino 5 168 20.02.2017 16:14
Letzter Beitrag: Medolino
  Display über I2-Bus betreiben mfri 22 716 23.01.2017 11:06
Letzter Beitrag: renid55
  Über drei Taster zwei externe Timer steuern Sidamo 23 611 09.01.2017 20:12
Letzter Beitrag: Tommy56
  Serial Output Buffer abfragen BennIY 5 182 05.01.2017 18:51
Letzter Beitrag: Tommy56
  Korrekte serial.print Befehlszeile Franz54 16 730 22.12.2016 18:37
Letzter Beitrag: renid55
  Arduino IDE Serial Plotter futsch? SensorX10 2 265 13.12.2016 13:42
Letzter Beitrag: SensorX10
  matrix display elegoo uno R3 starter set lecker16 7 532 23.11.2016 21:14
Letzter Beitrag: Bitklopfer
  Ausgabe Serial Monitor zu viele Byt`s Hannes 0 206 12.11.2016 20:29
Letzter Beitrag: Hannes

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste