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
  Timer 0 Mathias 8 246 02.12.2017 17:26
Letzter Beitrag: MicroBahner
  TFT Display Tool für Planung des Screenaufbaus rev.antun 16 448 29.11.2017 16:03
Letzter Beitrag: rev.antun
Lightbulb Wie kann ich Daten vom Nextion Display auf Arduino Mega2560 senden und benutzen MarkusA 14 937 02.11.2017 23:10
Letzter Beitrag: MarkusA
  Daten übergabe ans Nextion Display Franz54 53 2.745 09.10.2017 09:16
Letzter Beitrag: Franz54
  Nextion Display komma Zahlen darstellen becki133 8 677 18.09.2017 18:26
Letzter Beitrag: becki133
  433 MHz - Empfaenger + OLED display Matthias_Arduino 4 371 03.09.2017 17:25
Letzter Beitrag: hotsystems
  Wartet Serial.begin() auf COM-Port? tollewurst 4 564 19.08.2017 09:50
Letzter Beitrag: rkuehle
Wink Arduino TFT Display MEGA 2560 Samsuino 47 3.893 24.07.2017 12:45
Letzter Beitrag: Harry Hirsch
  Serial.write fraju 5 944 23.07.2017 21:57
Letzter Beitrag: Mathias
  Nextion Display führt keine gesendeten Befehle aus re.eule 12 2.014 13.07.2017 21:46
Letzter Beitrag: SkobyMobil

Gehe zu:


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