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
  2,8" Touchscreen Display Shield - so gehts avoid 1 197 04.06.2018 11:57
Letzter Beitrag: Crazy
  Problem mit TFT Display Anzeige wechseln Thor Wallhall 9 462 02.06.2018 23:30
Letzter Beitrag: Thor Wallhall
Sad Hilfe bei 2.4 TFT Display Harry Hirsch 56 3.262 27.05.2018 22:07
Letzter Beitrag: hotsystems
  Timer Jack 9 676 22.05.2018 08:53
Letzter Beitrag: Jack
  TFT Display will nicht so wie ich Franzel007 10 561 12.05.2018 09:28
Letzter Beitrag: amithlon
  Schrifttypen einbinden für TFT Display Thor Wallhall 35 2.056 05.04.2018 22:24
Letzter Beitrag: Thor Wallhall
  Fehlende Einerstelle auf LCD Display Ardu2018 8 570 26.03.2018 09:45
Letzter Beitrag: Tommy56
  Serial auslesen > 64 Byte uk1408 18 1.121 09.03.2018 16:05
Letzter Beitrag: Tommy56
  Arduino und Nextion Display Diskusguppy 16 1.254 08.03.2018 02:26
Letzter Beitrag: Diskusguppy
  Problem mit OLED 0.96" Display torsten_156 5 1.895 07.03.2018 23:27
Letzter Beitrag: Tommy56

Gehe zu:


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