Forum: Mikrocontroller und Digitale Elektronik DCC Signal wird nicht erkannt


von Michael E. (mieb)


Angehängte Dateien:

Lesenswert?

Hallo Leute,

die letzten Tage hab ich mich wieder an mein Projekt eines DCC-Dekoders 
Marke Eigenbau gesetzt. Allerdings bin ich langsam am verzweifeln, da 
ich nicht mehr weiß wo noch der Fehler liegen könnte.
Zum Abgreifen des Signals verwende ich die angehängte Schaltung.
Um die Schaltung zu testen wollte ich eine LED einschalten, wenn eine 0 
empfangen wird. Allerdings leuchtet diese nie (ja die LED funktioniert 
und ist richtig herum eingebaut).

Wäre sehr dankbar wenn da mal jemand über Schaltung und Progrämmchen 
drüberschauen könnte und vielleicht ne Idee hat wo ich einen Fehler 
mache.
1
; Mikrocontroller: ATtiny45
2
; Versorgungsspannung: 4,5-5V
3
; Taktart: Interner Oszillator
4
; Taktfrequenz: 8MHz
5
; Brown-out Detection: 2,7V
6
.include "tn45def.inc"
7
8
.def temp = r16
9
10
;------------------------------- Interruptvektortabelle --------------------------------
11
.org 0x0
12
  rjmp RESET        ; 0x0 (Reset Handler)
13
  rjmp INT0_ISR      ; 0x1 (External Interrupt Request 0 Handler)
14
  reti          ; 0x2 (Pin Change Interrupt Request 0 Handler)
15
  reti          ; 0x3 (Timer/Counter1 Compare Match A Handler)
16
  reti          ; 0x4 (Timer/Counter1 Overflow Handler)
17
  reti          ; 0x5 (Timer/Counter0 Overflow Handler)
18
  reti          ; 0x6 (EEPROM Ready Handler)
19
  reti          ; 0x7 (Analog Comparator Handler)
20
  reti          ; 0x8 (ADC Conversion Complete Handler)
21
  reti          ; 0x9 (Timer/Counter1 Compare Match B Handler)
22
  rjmp TIMER0_COMPA_ISR  ; 0xA (Timer/Counter0 Compare Match A Handler)
23
  reti          ; 0xB (Timer/Counter0 Compare Match B Handler)
24
  reti          ; 0xC (Watchdog Time-out Handler)
25
  reti          ; 0xD (USI Start Handler)
26
  reti          ; 0xE (USI Overflow Handler)
27
28
RESET:
29
  ; Stackpointer initialisieren
30
  ldi temp, LOW(RAMEND)
31
  out SPL, temp
32
33
  ldi temp, HIGH(RAMEND)
34
  out SPH, temp
35
36
  ; Alle I/O Pins werden vom Controller als Eingänge ohne aktivierten Pull-Up Widerstand initialisiert
37
  ; Alle benötigten Ausgänge müssen festgelegt werden
38
  sbi DDRB, DDB4  ; PB4 wird als Spannungsquelle für eine LED verwendet
39
40
  ; Um undefinierte Potenziale zu vermeiden werden an allen eingängen die Pull-Up Widerstände aktiviert, um diese auf ein definiertes Potenzial(VCC) zu bringen
41
  ldi temp, (1 << PORTB0) | (1 << PORTB1) | (1 << PORTB2) | (1 << PORTB3) | (1 << PORTB5)
42
  out PORTB, temp
43
44
  ; Timer/Counter0 Initialisierung
45
  ; Frequenz: ~12,8kHz (80us)
46
  ldi temp, (1 << TSM) | (1 << PSR0)  ; Timer/Counter0 wird in Konfigurationsmodus versetzt
47
  out GTCCR, temp
48
49
  ldi temp, (1 << WGM01)  ; Verwende Timer im CTC-Modus
50
  out TCCR0A, temp
51
52
  ldi temp, (1 << CS01)  ; Timer/Counter Prescaler von 8 (=> Timer/Counter Frequenz von ~1MHz)
53
  out TCCR0B, temp
54
55
  ldi temp, 80  ; Nach 80 Zählzyklen soll der Timer zurückgesetzt werden
56
  out OCR0A, temp
57
58
  ldi temp, (1 << OCIE0A)  ; Aktiviere Timer/Counter0 Compare Match A Interrupt
59
  out TIMSK, temp
60
61
  ; Konfiguration des External Interrupt 0
62
  ldi temp, (1 << ISC01) | (1 << ISC00)
63
  out MCUCR, temp  ; Auslösen eines Interrupts bei steigender Flanke an INT0
64
65
  ldi temp, (1 << INT0)
66
  out GIMSK, temp  ; Aktiviere External Interrupt 0
67
68
  sei ; Interrupts global aktivieren
69
70
dcc:
71
  rjmp dcc
72
  
73
INT0_ISR:
74
  push temp
75
  clr temp
76
  out GTCCR, temp  ; Timer/Counter0 starten
77
  pop temp
78
  reti
79
80
TIMER0_COMPA_ISR:
81
  push temp
82
  ldi temp, (1 << TSM) | (1 << PSR0)  ; Timer/Counter0 wieder stoppen
83
  out GTCCR, temp
84
  sbic PINB, INT0
85
  sbi PORTB, PORTB4 ; Einschalten wenn eine 0 empfangen wurde
86
  pop temp
87
  reti

von Paul B. (paul_baumann)


Angehängte Dateien:

Lesenswert?

Ich habe Dir mal meine funktionsfähige Schaltung (allerdings mit Tiny15) 
angehangen. Bei mir ist aber ein 100nF Stützkondensator drin und ein 
Ziehwiderstand an Reset gegen +Ub.

Daß das funktioniert, sieht man am 2. angefügten Bild.



MfG Paul

: Bearbeitet durch User
von J. S. (engineer) Benutzerseite


Lesenswert?

Müsste man das nicht generell kapazitiv ankoppeln?

von Paul B. (paul_baumann)


Lesenswert?

Jürgen S. schrieb:
> Müsste man das nicht generell kapazitiv ankoppeln?

Müsste man offensichtlich nicht ,denn es funktioniert ja so.

MfG Paul

von Thomas P. (topla)


Lesenswert?

Michael E. schrieb:
> TIMER0_COMPA_ISR:
>   push temp
>   ldi temp, (1 << TSM) | (1 << PSR0)  ; Timer/Counter0 wieder stoppen
>   out GTCCR, temp
>   sbic PINB, INT0
>   sbi PORTB, PORTB4 ; Einschalten wenn eine 0 empfangen wurde
>   pop temp
>   reti

INT0 ist mit "6" definiert, siehe auch Deine Initialisierung von GIMSK.
Mit "sbic PINB, INT0" fragst Du Pin6 von PortB ab, der ist im Tiny nicht 
vorhanden und wird laut Datenblatt immer mit 0 gelesen.

Thomas

von Michael E. (mieb)


Lesenswert?

Paul B. schrieb:
> Ich habe Dir mal meine funktionsfähige Schaltung (allerdings mit Tiny15)
> angehangen. Bei mir ist aber ein 100nF Stützkondensator drin und ein
> Ziehwiderstand an Reset gegen +Ub.
>
> Daß das funktioniert, sieht man am 2. angefügten Bild.
>
>
>
> MfG Paul

Hab die Reset Beschaltung jetzt mal so übernommen (sprich 10k Pull-up 
zwischen VCC und Reset sowie 100nF Elko(?!) zwischen Reset und GND)

Hab die schon öfter gesehen und kann ja nix schaden

Thomas P. schrieb:
> INT0 ist mit "6" definiert, siehe auch Deine Initialisierung von GIMSK.
> Mit "sbic PINB, INT0" fragst Du Pin6 von PortB ab, der ist im Tiny nicht
> vorhanden und wird laut Datenblatt immer mit 0 gelesen.

Das hab ich nun wirklich voll übersehen
Dachte zugunsten der Lesbarkeit schreib ich hin, dass das der INT0 Pin 
ist.
Ich vermute einfach mal, dass das der Wurm bei der Angelegenheit war.
Vielen Dank schonmal im Voraus (hab es noch nicht getestet)
Da wäre ich noch 3 Tage gesessen bis ich auf den Trichter gekommen wäre.

Viele Grüße
Michael

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.