www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Pulslängeenproblem


Autor: Karl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Folks,

ich bin dabei ein Modul mit einem ATMEGA8 zu bauen, welches Messdaten 
einließt und sie zu einem anderen myC schickt.
Die Messdaten werden über die Länge eines Pulses codiert (z.B. 
gemessener Wert = 1000 -> Pulslänge = 32ms).
Zum Testen der Sendevorrichtung habe ich beiliegendes Programm 
geschrieben.
Der Ablauf: zunächst wird ein Puls der Länge 2 übertragen, um dem 
Empfänger zu signalisieren, dass gleich Daten kommen (Die Datenimpulse 
sind mindestens 5 "Zyklen" lang).
Dann wird der Datenpuls übertragen. Das wiederholt, wobei die zu sendene
Zahl bei jedem mal inkrementiert wird.

Das klappt soweit alles gut, dass Problem ist, dass ab einer gewissen
Pulslänge die Signale peridoisch um 255 verkleinert gesendet wird (mit 
Oszi nachgemessen). Ich habe gestern lange rumgerätselt aber ich finde 
die Lösung nicht. Vielleicht fällt einem von euch was ein???


Grüße
Karl


Code des Senders:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#define sendPort PORTC
#define sendBit PC4


void long_delay(int ms) {
  
    for(; ms>0; ms--) _delay_ms(1);
}

volatile  int times = 0;


ISR (TIMER0_OVF_vect)
{
    times--;
    
}

 
void sendData(unsigned int sig){
    times = sig+5;
    TCNT0 = 0;
    TCCR0 |= (1 << CS00);
    sendPort |= (1 << sendBit);
    while(times > 0){;}
    sendPort &= ~(1 << sendBit);
    TCCR0 = 0;
    TCNT0 = 0;
    _delay_us(10);
}

void sendSync(){
    times = 2;
                TCNT0 = 0;
    sendPort |= (1 << sendBit);
    TCCR0 |= (1 << CS00);
    while(times > 0){;}
    sendPort &= ~(1 << sendBit);
    TCCR0 = 0;
    TCNT0 = 0;
    _delay_us(10);
}

int main(void)
{
  //Datenleitung
  DDRC |= (1 << PC4);
  PORTC &= ~(1 << PC4);
  
  TIMSK |= (1<<TOIE0);
  sei();  
  
  unsigned int a = 0;
  while(1 < 2){
    
    sendSync();
    sendData(a);
    
    a++;
    long_delay(100);
  }
  
    
//...
}

Was beim Empfänger ankommt (bis 253 funktioniert die Übertragung 
tadellos):
246;247;248;249;250;251;252;253;-1;255;256;257;3;259;260;261;7;263;264;2 
65;11;267;268;269;15;271;272;273

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>     times = sig+5;
>    times = 2;
>    while(times > 0){;}

times musst du außerhalb der ISR (TIMER0_OVF_vect) atomar lesen und 
schreiben (Interrupt). times kann als 16-Bit Wert nicht in einer 
ununterbrechbaren Maschineninstruktion gelesen oder manipuliert werden.

times würde ich auch unsigned int machen, sonst kann es bei times = 
sig+5 Probleme mit Überlauf geben (kann es bei unsigned int auch, aber 
bei int wesentlich früher)

Autor: Karl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach logisch!

Ok es funktioniert vielen Dank

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.