TODOPIC
Otros Microcontroladores / Dispositivos programables => Microcontroladores 8 bits => Mensaje iniciado por: QIQE en 22 de Junio de 2014, 21:18:30
-
Buenas todos, tengo el siguiente problema, he programado un atmega 168 para tener dos señales Pwm centradas esto es algo así
___|-------|_____
_____|--|_________
Pero al probarlo en mi placa con el osciloscopio me queda alineado a la izquierda, por decirlo de alguna manera, tal que así.
___|-------|_____
________|--|_____
En proteus si que me funciona bien alguien tiene idea de lo puede estar pasando???
hours, in proteus works well but in the microcontroller no.
Code:
#define F_CPU 8000000UL
#include <avr/io.h>
#include <avr/pgmspace.h>//Librería necesaria para el PCD8544
#include <util/delay.h>
#include <avr/interrupt.h>
#include "pcd8544.h"
#include "pcd8544.c"
#include "stdlib.h"
#include <stdint.h>
#include <avr/eeprom.h >
void Configura_Puertos (void)
{
// 76543210
DDRD=0b01100000;//Puerto
// ||||||||___
// |||||||____
// ||||||_____
// |||||______
// ||||_______
// |||________ PWM1
// ||_________ PWM2
// |__________
//PORTD=0b00000111; //Activo los pull-ups
DDRC|=0b00000100;//Puertos
PORTB|=0b00000100;//Retroiluminación GLCD
}
void Config_PWM_8b (void)
{
TCCR0A=0b10100001;
// ||||||||_ WGM00
// |||||||__ WGM01
// ||||||___
// |||||____
// ||||_____ COM0B0 TOGLE OC0A
// |||______ COM0B1
// ||_______ COM0A0
// |________ COM0A1
TCCR0B=0b00000001;
// ||||||||_ CS00
// |||||||__ CS01
// ||||||___ CS02
// |||||____ WGM02
// ||||_____
// |||______
// ||_______ FOC0B
// |________ FOC0A
//TCNT0=0b00000001;
OCR0B=0b11000000;
OCR0A=0b11110001;
//OCR0B=0b00001111;
}
int main(void)
{
Configura_Puertos ();
Config_PWM_8b();
while(1)
{
}
}
Muchas gracias
-
Hola QIQE!,
ha leido el Datasheet del Atmega168? el ese Atmega tiene 6 puerto PWM que son
PuertoD.3 (PCINT19/OC2B/INT1)
PuertoD.5 (PCINT21/OC0B/T1)
PuertoD.6 (PCINT22/OC0A/AIN0)
PuertoB.1 (OC1A/PCINT1)
Puertob.2 (SS/OC1B/PCINT2)
Puertob.3 (MOSI/OC2A/PCINT3)
Cuando configura asi:
DDRD=0b01100000;//Puerto
// ||||||||___
// |||||||____
// ||||||_____
// |||||______
// ||||_______
// |||________ PWM1
// ||_________ PWM2
// |__________
//PORTD=0b00000111; //Activo los pull-ups
no puedo ayudarte muchos porque yo de GGC no se muchos.
yo en tu lugar probaria sin activar la Pulldown, aunque si no tiene muchas experiencia, te recomiendo que haga un Test solo usando los PWM, juega con ellos, asi aprendi yo, pero en Basic, yo uso BASCOM-AVR.
Mirar este ejemplo por aqui
http://www.protostack.com/blog/2011/06/atmega168a-pulse-width-modulation-pwm/
Saludos
-
si uso D.5 y D.6 los pull ups no los empleo están comentados.
-
Buenas. He probado tu programa tanto en proteus como en un atmega 2560 (aprovecho una placa arduino para hacer pruebas rápidas) y tu programa creo que me ha funcionado correctamente. Te adjunto una foto para que lo veas. Si lo ves correcto tal vez sea algún problema de los fuses, aunque no sabría decirte cual... Sino tal vez por algún ajuste del osciloscopio. Lo único que he cambiado ha sido el OCR0A y B por el OCR1A y B ya que en este micro el 0 no está pero por lo demás el programa es el tuyo. Un saludo.
(http://imageshack.com/a/img849/1463/t3tm.jpg)
-
Muchísimas gracias, si que era un problema del osciloscopio del trigger, una vez ajustado ha funcionado sin problemas una vez mas muchas gracias
-
De nada, me alegro que te haya funcionado bien. Un saludo.