mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Frequenzmessung mit übertragung an RS232


Autor: Pascal Enz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guten Tag

im Anhang mein Programm.
(Target ATMEGA128)

Es wird ein Laserstrom über ADC gemessen -> funktioniert

Daten werden über RS232 übertragen -> läuft

Frequenz wird über den ICP1 gemessen.

über das Terminal gibt er mir sobald ich ein "f" sende 
(Frequenzmessungsroutine) eine unmengen an Daten zurück.
Jedoch nix brauchbares.

Was habe ich im Code übersehen?
Danke für die Antwort.

Mit besten Grüssen aus dem kleinen Nachbarländchen...

Autor: Pascal Enz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
;***************************************************************
;*
;* Project Adressboard-EDM
;*
;* Project Description Here
;*
;***************************************************************
;*
;* Author: Pascal Enz
;* Lab: 3044
;* Date: 1.9.08
;*
;***************************************************************
.include "m128def.inc" ; Definition file for ATmega128
.include "macros.inc"

#define F_CPU 1000000
;***************************************************************
;* Program Constants
;***************************************************************
.equ const =$00 ; Generic Constant Structure
.equ baud = 2400
.equ UBRR_VAL = ((F_CPU+BAUD*8)/(BAUD*16)-1)
.equ BAUD_REAL = (F_CPU/(16*(UBRR_VAL+1)))
.equ BAUD_ERROR = ((BAUD_REAL*1000)/BAUD-1000)




.if ((BAUD_ERROR>10) || (BAUD_ERROR<-10))
.error "Baudrate grösser 1 Prozent"
.endif

;***************************************************************
;* Program Variables Definitions
;***************************************************************

.def temp = r16
.def zeichen = r17
.def mpr = r18
.def testzeichen = r19
.def adapterwahl = r20
.def stacktemp = r21
.def nummer = r22
.def overflow = r23
.def flanke = r24
.def time11 = r1
.def time21 = r2
.def time12 = r3
.def time22 = r4
.def finito = r25

;***************************************************************
;* Interrupt Vectors
;***************************************************************
.cseg
.org $0000 ; Define start of Code segment
ldi overflow,0

rjmp RESET ; Reset Handler



.org $0016

rjmp Auswert


.org $001C

rjmp TIMER_OVER


reti ; IRQ0 Handler
nop
reti ; IRQ1 Handler
nop
reti ; Timer2 Compare Handler
nop
reti ; Timer2 Overflow Handler
nop
reti ; Timer1 Capture Handler
nop
reti ; Timer1 CompareA Handler
nop
reti ; Timer1 CompareB Handler
nop
reti ; Timer1 Overflow Handler
nop
reti ; Timer0 Overflow Handler
nop
reti ; SPI Transfer Complete Handler
nop
reti ; USART RX Complete Handler
nop
reti ; UDR Empty Hanlder
nop
reti ; USART TX Complete Handler
nop
reti ; ADC Conversion Complete Handler
nop
reti ; EEPROM Ready Hanlder
nop
reti ; Analog Comparator Handler
nop
reti ; Two-wire Serial Interface Handler
nop
reti ; Store Program Memory Ready Handler
nop
;***************************************************************
;* Func: RESET
;* Desc: Reset Handler Routine
;***************************************************************
RESET:
; ***** Stack Pointer Init *****
ldi mpr, LOW(RAMEND)
out SPL, mpr
ldi mpr, HIGH(RAMEND)
out SPH, mpr
ldi mpr,0b11111111
out DDRC,mpr
ldi temp,high(UBRR_VAL)
sts UBRR1H,temp
ldi temp,low(UBRR_VAL)
sts UBRR1L,temp
lds temp,UCSR1B
sbr temp,0b00011000
sts UCSR1B,temp
ldi mpr, 0b00001000
out DDRD,mpr
ldi finito,0
rjmp init

;***************************************************************
;* Func: MAIN
;* Desc: Main Entry into program
;***************************************************************
init:


ldi zeichen, 'E'
rcall serout
ldi zeichen, 'D'
rcall serout
ldi zeichen, 'M'
rcall serout
ldi zeichen, '-'
rcall serout
ldi zeichen, 'A'
rcall serout
ldi zeichen, 'd'
rcall serout
ldi zeichen, 'a'
rcall serout
ldi zeichen, 'p'
rcall serout
ldi zeichen, 't'
rcall serout
ldi zeichen, 'e'
rcall serout
ldi zeichen, 'r'
rcall serout
ldi zeichen, '-'
rcall serout
ldi zeichen, 'V'
rcall serout
ldi zeichen, '.'
rcall serout
ldi zeichen, '1'
rcall serout
ldi zeichen, 13
rcall serout
ldi zeichen, 10
rcall serout
;< Insert your program Here>


sbi ADMUX,REFS0
cbi ADMUX,REFS1
cbi ADMUX,MUX0
cbi ADMUX,MUX1
cbi ADMUX,MUX2
cbi ADMUX,MUX3
cbi ADMUX,MUX4
sbi ADCSRA,ADEN

ldi mpr,0b00000000
out PORTC,mpr






rjmp main
;***************************************************************
;* Func: MAIN
;* Desc: Main Entry into program
;***************************************************************
MAIN:
ldi flanke,0
ldi finito,0
ldi overflow,0






polling_at:

load temp, UCSR1A
sbrs temp, RXC1
rjmp polling_at

lds temp,UDR1 ; UART Polling zum abwarten des Befehls
ldi mpr,'d'
cp temp,mpr
breq dagoon;  Transistor durchschalten - Gerät1 on
ldi mpr,'a'
cp temp,mpr
breq atron;    Transistor durchschalten - Gerät2 on
ldi mpr,'o'
cp temp,mpr
breq hardoff;  Transistor sperren - all off
ldi mpr,'l'
cp temp,mpr
breq adcstart;  Laserstrommessung durchführen
ldi mpr,'f'
cp temp,mpr
breq timeinit;  Counter1 initialisieren
rjmp MAIN

adcstart:
sbi ADCSRA,ADIE
sbi ADCSRA,ADSC

adcloop:

load temp,ADCSRA
sbrs temp,ADIF
rjmp adcloop

in zeichen, ADCL
rcall serout

in zeichen, ADCH
rcall serout



rjmp Main


hardoff:

ldi mpr,0b00000000
out PORTC,mpr

rjmp MAIN


dagoon:

ldi mpr,0b00001000
out PORTC,mpr

rjmp MAIN

atron:

ldi mpr,0b00001100
out PORTC,mpr

rjmp MAIN

serout:


lds temp,UCSR1A; Übertragungsroutine RS232
sbrs temp,5
rjmp serout
sts UDR1,zeichen

ret

USART_Rec:

lds temp, UCSR1A

sbrs temp,7
rjmp USART_Rec
lds r16, UDR1

ret


TIMER_OVER: ; Timer1 Overflow Interrupt
cli
ldi mpr,1
add overflow,mpr
sei
reti

timeinit: ; Initialisierung Timer1
load temp, TCCR1A
   sbr temp, (0<<COM1A1)
sbr temp, (0<<COM1B1)
sbr temp, (0<<COM1C1)
sbr temp, (0<<WGM11)
sbr temp, (0<<WGM10)
store TCCR1A,temp
load temp,TCCR1B
 sbr temp, (1<<ICNC1)
sbr temp, (1<<ICES1)
sbr temp, (1<<CS10)
sbr temp, (0<<CS11)
sbr temp, (1<<CS12)
store TCCR1B,temp
load temp, TIMSK
sbr temp, (1<<TOIE1)
sbr temp, (1<<TICIE1)
store TIMSK,temp
sei
rjmp freqmeas

auswert:  ; erste Flanke an ICP1
cli
ldi mpr,0  ; flag für erste Flanke
cp flanke,mpr
brne secflank
ldi overflow,0
in zeichen,ICR1L ;zeichen für RS232
rcall serout  ; rs232 übertragung
in zeichen,ICR1H
rcall serout
ldi flanke,1
sei
reti

secflank: ; zweite Flanke an ICP1
cli
ldi flanke,0
in zeichen,ICR1L
rcall serout
in zeichen,ICR1H
rcall serout
mov zeichen,overflow
rcall serout
ldi finito,1
reti


freqmeas:  ; loop-routine der frequenzmessung

ldi mpr,1
cp finito,mpr
brne freqmeas
cli
rjmp main

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Was habe ich im Code übersehen?

Habe ich den Code übersehen?

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Habe ich den Code übersehen?

Bist Du aber blind :-)

Autor: rene (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist aber duesterste Klempnerei. In den Interrupts muss man die 
Interrupts nicht abschalten, sind sie bereits. Es gibt gewisse 
interrupts, da muss man mehr machen als nur ein reti, sonst beleibt die 
Bedingung bestehen. Zudem muss man in einem Interupt das Statusregister 
wegspeichern und restoren sonst ist eh nichts.

Als beispiel schau dir mal
http://www.ibrtses.com/embedded/avr.html
an. Da hat's auch ein paar beispiele.

Autor: Pascal Enz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die rasche Antwort.

Ja, man wird wohl merken, dass ich bereits seit zwei Jahren nichts mehr 
in Assembler geschrieben habe...

Also habe, die Overflow, resp Capture Interrupt mit Push und Pop (SREG) 
erweitert.
Zudem habe ich die CLI SEI anderst gesetzt.

Nach meinen Überlegungen müsste nach einer kompletten Signalperiode das 
Programm wieder ins Main springen.
Ich bekomme nun eine wahre Datenflut rein über RS232.

Wie bekomme ich das sonst noch besser geklemptnert? Irgendwelche smarte 
Ideen?
TIMER_OVER: ; Timer1 Overflow Interrupt
push r5
in r5,SREG
push r5
ldi mathreg,1
add overflow,mathreg
pop r5
out SREG,r5
pop r5
reti

timeinit: ; Initialisierung Timer1
load temp, TCCR1A
   sbr temp, (0<<COM1A1) 
sbr temp, (0<<COM1B1) 
sbr temp, (0<<COM1C1) 
sbr temp, (0<<WGM11) 
sbr temp, (0<<WGM10)
store TCCR1A,temp
load temp,TCCR1B
 sbr temp, (1<<ICNC1) 
sbr temp, (1<<ICES1) 
sbr temp, (1<<CS10) 
sbr temp, (0<<CS11) 
sbr temp, (1<<CS12) 
store TCCR1B,temp
load temp, TIMSK
sbr temp, (1<<TOIE1) 
sbr temp, (1<<TICIE1)
store TIMSK,temp 
sei
rjmp freqmeas

auswert:  ; erste Flanke an ICP1
push r5
in r5,SREG
push r5
ldi mpr,0  ; flag für erste Flanke
cp flanke,mpr
brne secflank
ldi flanke,1
ldi overflow,0
in zeichen,ICR1L ;zeichen für RS232
rcall serout  ; rs232 übertragung
in zeichen,ICR1H
rcall serout
pop r5
out SREG,r5
pop r5

reti

secflank: ; zweite Flanke an ICP1

ldi flanke,0
in zeichen,ICR1L
rcall serout
in zeichen,ICR1H
rcall serout
mov zeichen,overflow
rcall serout
ldi finito,1
pop r5
out SREG,r5
pop r5
cli
reti


freqmeas:  ; loop-routine der frequenzmessung

ldi mpr,1
cp finito,mpr
brne freqmeas
cli
rjmp main

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.