Hallo!
uC: ATmega8
Entwicklungsumgebung AVRStudio
folgendes problem mit nachfolgendem Code:
Nach reset wird auf PortC 0b?1111111 ausgegeben.
Wenn der Timer Interrupt kommt, wird PortC eingelesen, invertiert und
wieder auf PortC ausgegeben. (sollte dann etwa auf 0V ausgegeben
werden). An den Ports liegt allerdings 2,5V (Vcc/2) an.
wenn ich direkt auf den PortC 0x00 ausgebe, erhalte ich das gewünschte
Ergebnis.
danke für eure hilfe
stefan
----------------------------------------------------------------------
.include "m8def.inc"
.def temp = r16
.equ AUS = 0x00
.equ EIN = 0xff
.equ TIMERSET = 0x00
.org 0x000
rjmp RESET
reti; rjmp EXT_INT0 ; IRQ0 Handler
reti; rjmp EXT_INT1 ; IRQ1 Handler
reti; rjmp TIM2_COMP
reti; rjmp TIM2_OVF
reti; rjmp TIM1_CAPT ; Timer1 Capture Handler
rjmp TIM1_Compare_A ; Timer1 CompareA Handler
reti; rjmp TIM1_COMPB ; Timer1 CompareB Handler
reti; rjmp TIM1_OVF ; Timer1 Overflow Handler
reti; rjmp TIM0_OVF ; Timer0 Overflow Handler
reti; rjmp SPI_STC ; SPI Transfer Complete Handler
reti; rjmp USART_RXC ; USART RX Complete Handler
reti; rjmp USART_DRE ; UDR Empty Handler
reti; rjmp USART_TXC ; USART TX Complete Handler
reti; rjmp ADC ; ADC Conversion Complete Interrupt
Handler
reti; rjmp EE_RDY ; EEPROM Ready Handler
reti; rjmp ANA_COMP ; Analog Comparator Handler
reti; rjmp TWSI ; Two-wire Serial Interface Handler
reti; rjmp SPM_RDY ; Store Program Memory Ready
Handler
RESET:
;set stack
ldi temp, LOW(RAMEND)
out SPL, temp
ldi temp, HIGH(RAMEND)
out SPH, temp
;set port
ldi temp, 0xff
out DDRC, temp
ldi temp, EIN
out PORTC, temp
;set timer
ldi temp, (1<<CS11) | (1<<CS10)
out TCCR1B, temp
ldi temp, 1<<OCF1A
out TIFR, temp
ldi temp, 1<<OCIE1A
out TIMSK, temp
ldi temp, 0x09
out OCR1AL, temp
ldi temp, 0x3D
out OCR1AH, temp
sei
ldi temp, 0x00
out TCNT1L, temp
out TCNT1H, temp
work:
rjmp work
TIM1_Compare_A:
;Werte sichern
push temp
in temp, SREG
push temp
;Port toggeln
in temp, PINC
com temp
out PORTC, temp
;Timer zurücksetzten
ldi temp, 0x00
out TCNT1L, temp
out TCNT1H, temp
;Werte zurückspielen
pop temp
out SREG, temp
pop temp
reti
;Port toggeln in temp, PINC <<<<<<<<<<<< ??? com temp out PORTC, temp
immer wieder dasselbe, ohne jetzt weiter in das Programm eingestiegen zu sein: 16bit-Schreiboperationen: "consequently, the high byte must be accessed first..."
hi, ich vermute, das die timer frequenz so hoch ist, das du dann einen PWM ausgang gebastelt hast und nun eben bei 50% an und 50% aus eben genau die hälfte der spannung. sezt mal den die timerfrequenz kleiner. grüsse
hi nochmal, wenn ich nix falsch verstanden habe, dann ist doch das TCCR1A und TCCR1B für die initialisierung der timers. versuchs mal mit TCCR1A=0x00; TCCR1B=0x05; als feste werte. grüsse
hi stefan, hast du es schon probiert? geht es ? grüsse
hi kamil! joop es funzt. einerseits der tipp mit dem pwm war nicht schlecht (falsches teilerverhältnis 64 statt 1024);andererseits die schreiboperation high vor low byte dürfte auch das seinige beigetragen haben. was ich nicht nachvollziehen kann ist, dass ich den wert nicht über PINC einlesen kann, da dies ja in der atmel doku eigentlich beschrieben wird. lg
@stefan Ähh? Das mit PINC war ein, in übernächtigter Duseligkeit geborenen, Schnellschuß von mir. Wie machst Du es denn jetzt??? Ich habe auch noch mal nachgeschaut. PINC sollte eigentlich gehen.
Hi Oliver! Habe nach deinem Posting natürlich auch PORTC ausprobiert und hat auch funktioniert, aber ich mach es jetzt nach der Doku mit PINC. lg
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.